Vue.js 变异道具对象的数据副本是否比变异道具更好?为什么?

Vue.js 变异道具对象的数据副本是否比变异道具更好?为什么?,vue.js,vuejs2,Vue.js,Vuejs2,Vue文档中有一节介绍单向数据流: 这里它解释了你不应该变异道具。此外,它还说: 道具用于传递初始值;子组件希望以后将其用作本地数据属性。在这种情况下,最好定义使用道具作为其初始值的本地数据属性: props: { initialMyObject: { type: Object, required: true } }, data() { return { myObject: this

Vue文档中有一节介绍单向数据流:

这里它解释了你不应该变异道具。此外,它还说:

道具用于传递初始值;子组件希望以后将其用作本地数据属性。在这种情况下,最好定义使用道具作为其初始值的本地数据属性:

props: {
        initialMyObject: {
            type: Object,
            required: true
        }
    },

data() {
    return {
        myObject: this.initialMyObject
    }
}
在这一部分的底部,有一个注释说:

请注意,JavaScript中的对象和数组是通过引用传递的,因此如果prop是一个数组或对象,则在子组件中改变对象或数组本身将影响父状态

我正在考虑这样一种情况,即您有一个作为对象(或数组)的道具,并且您定义了一个使用道具作为其初始值的本地数据属性:

props: {
        initialMyObject: {
            type: Object,
            required: true
        }
    },

data() {
    return {
        myObject: this.initialMyObject
    }
}
如果我改变数据项
myObject
,因为它是一个对象,道具本身最终会改变。因此,这在本质上与“改变道具”相同,并且需要避免吗?在这种情况下,是否最好在需要更改对象时发出事件(或使用Vuex)


提前感谢您在这方面的帮助。

您只需克隆它即可-

data() {
    return {
        myObject: {...this.initialMyObject}
    }
}
为了避免它

但是是的,你不能将值重新分配给
prop
as

这只是因为
对象
是一种参考内存。当数组或对象存储在任何变量中时,它都是一个引用变量

内存管理在这种情况下,引用变量将指向堆中的内存地址,以便您可以向地址添加更多的n个值。但是,即使使用新地址,也不能用任何新值替换该地址


根据我的偏好,您应该更喜欢
Vuex
,只要您希望更新整个项目的值

正确。从单向数据流的角度来看,在数据中使用别名并不比通过同一对象的prop名称对其进行变异更好。