想象一下,我有一个带有多个道具的对象,我想将其带入各种 vue 组件的“数据”状态,作为一种起点或默认状态。我希望每个组件都能够从初始化的那一刻起管理自己的状态。就像是:import { initialData } from '../../some-data.js'Vue.component('my-component', { data: function () { return { ...initialData, somethingElse: 'hello there", } }, template: 'Hi'})Vue 是否会对该对象进行深度复制,以便当它因用户交互而发生变化时,原始对象(位于 some-data.js 中)将不会发生变化,或者我是否需要自己使用类似的方法来做到这一点:import { initialData } from '../../some-data.js'Vue.component('my-component', { data: function () { return { ...JSON.parse(JSON.stringify(initialData)), somethingElse: 'hello there' } }, template: 'Hi'})
2 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
Vue 会深拷贝这个对象吗
深拷贝?不,但是您将获得该组件的浅表副本,因为您正在创建一个新对象(使用扩展语法)。
与任何浅拷贝一样,如果initialData
包含对象,那么这些对象将不会被深拷贝,但顶层字符串和数字(等)将被拷贝。
用来JSON.parse
做深拷贝是一种黑客攻击。最好使用像 lodash 这样的专用深拷贝方法_.cloneDeep
。或者你可以只写initialData
一个工厂函数:
const createInitialData = () => ({
foo: 'bar',
nestedObject: {
blah: 12345
}
})
data() {
return {
...createInitialData(),
somethingElse: 'hello there'
}
}
繁花不似锦
TA贡献1851条经验 获得超4个赞
为什么不尝试看看会发生什么?
some-data.js
在最后的文件中添加如下内容:
setInterval(function() { console.log(initialData) }, 1000);
然后当您导入它时,修改一些东西并查看日志会发生什么。
不管是哪种情况,您都应该使用 Vuex。
添加回答
举报
0/150
提交
取消