javascript - vue从vue外部导入数据以在组件中使用,我是否需要深复制

标签 javascript vue.js

想象一下,我有一个带有多个 props 的对象,我想将其带入各种 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'
})

谢谢。

最佳答案

Will Vue make a deep copy of this object

深层副本?否,但您将获得该组件的浅拷贝,因为您正在创建一个新对象(使用 spread syntax )。

与任何浅复制一样,如果 initialData 包含对象,那么这些对象将不会被深复制,但顶级字符串和数字(​​等)将被复制。


使用 JSON.parse 进行深层复制是一种黑客行为。最好使用像lodash这样的专用深复制方法_.cloneDeep 。或者您可以将 initialData 编写为工厂函数:

const createInitialData = () => ({
  foo: 'bar',
  nestedObject: {
    blah: 12345
  }
})
data() {
  return {
    ...createInitialData(),
    somethingElse: 'hello there'
  }
}

关于javascript - vue从vue外部导入数据以在组件中使用,我是否需要深复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64435251/

相关文章:

javascript - -= 0.1 奇怪的结果

javascript - 如何在 html 页面中添加脚本的结果?

javascript - 无法让 JS document.getElementById 在我的 Rails View 中工作

javascript - 如何在 jQuery 中粘贴时保持文本格式?

javascript - 如何在显示 ng-repeat 元素时应用延迟

javascript - 成功调用 axios 后,Vue.js 组件不会发送给父级

javascript - 具有 bool 查询参数的 Vue 路由器

javascript - Vue JS如何接受URLEncoded格式

javascript - Vue.js - 删除从 keep-alive 加载的子组件

javascript - 如果以前在 vue js html 中选择了这些选项,我该如何避免这些选项?