为了账号安全,请及时绑定邮箱和手机立即绑定

vue从vue外部导入数据在组件中使用,是否需要深拷贝

vue从vue外部导入数据在组件中使用,是否需要深拷贝

慕森卡 2023-05-25 16:47:41
想象一下,我有一个带有多个道具的对象,我想将其带入各种 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'

  }

}


查看完整回答
反对 回复 2023-05-25
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

为什么不尝试看看会发生什么?

some-data.js在最后的文件中添加如下内容:

setInterval(function() { console.log(initialData) }, 1000);

然后当您导入它时,修改一些东西并查看日志会发生什么。

不管是哪种情况,您都应该使用 Vuex。


查看完整回答
反对 回复 2023-05-25
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信