javascript - vue 从外部 vue 导入数据用于组件,是否需要深拷贝
问题描述
想象一下,我有一个带有几个道具的对象,我想将它们带入各种 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'
})
谢谢。
解决方案
Vue 会对该对象进行深拷贝吗
深拷贝?不,但是您将获得该组件的浅表副本,因为您正在创建一个新对象(使用扩展语法)。
与任何浅拷贝一样,如果initialData
包含对象,那么这些对象将不会被深度复制,但会复制顶级字符串和数字(等)。
用来JSON.parse
做深拷贝是一种黑客行为。最好使用像 lodash 这样的专用深拷贝方法_.cloneDeep
。或者你可以写成initialData
工厂函数:
const createInitialData = () => ({
foo: 'bar',
nestedObject: {
blah: 12345
}
})
data() {
return {
...createInitialData(),
somethingElse: 'hello there'
}
}
推荐阅读
- image - 资产 assets/appimage/test.png 在 pubspec.yaml 中不存在警告
- tags - 如何在免费版本中将“潜在客户”选项卡重命名为 bitrix24 中的其他内容
- python - 第三方django rest框架应用
- file - 如何重置/清除文件输入
- java - 如何使用 java 在 aerospike 数据库中搜索 2 个集合?
- vba - 即使不重复也会弹出重复条目的警告
- reactjs - React Native Metro 捆绑器选择要导入的文件。如何做出行为就像 Webpack 解析器 mainFiles
- google-apps-script - 如何让我的脚本只保存在 PDF 中的第一张具有一定范围的工作表。当前保存整个文件
- c# - 确定元素是否在从属视图中 (Revit API)
- javascript - 如何在 daterangepicker 范围内获取日期选择日期