Vue.js vue:如何使传递给组件的对象成为被动的?

Vue.js vue:如何使传递给组件的对象成为被动的?,vue.js,vuejs2,vue-component,Vue.js,Vuejs2,Vue Component,我有一个组件,它有一个位置对象作为道具。我传入的参数是locations[index],它是从locations数组中选择的项 但是,当索引更改时,组件无法做出反应。正如您在演示中看到的,当您单击按钮时,JSON会发生更改,但组件无法更新 使组件反应的最佳方法是什么 您的位置组件仅在挂载的钩子中填充省和市数据属性。当位置道具更改时,将不会再次调用挂载的钩子,因此会留下过时的数据 请改用计算属性: 计算:{ 省(){ 返回此.location.province; }, 城市(){ 返回此.loca

我有一个组件,它有一个
位置
对象作为
道具
。我传入的参数是
locations[index]
,它是从
locations
数组中选择的项

但是,当
索引
更改时,组件无法做出反应。正如您在演示中看到的,当您单击按钮时,JSON会发生更改,但组件无法更新


使组件反应的最佳方法是什么

您的
位置
组件仅在
挂载的
钩子中填充
数据属性。当
位置
道具更改时,将不会再次调用
挂载的
钩子,因此会留下过时的数据

请改用计算属性:

计算:{
省(){
返回此.location.province;
},
城市(){
返回此.location.city;
}
}

如果确实需要
作为数据属性(而不是计算属性),则需要查看
位置
道具来更新属性:

data(){
返回{
省:空,
城市:空
}
},
观察:{
地点:{
立即:是的,
装卸工(loc){
this.province=loc.province;
this.city=loc.city;
}
}
}

您的道具
位置中的嵌套项将不会是反应性的,您需要使用类似于:



就这样,不需要观察者或其他任何东西。

您可以绑定到location.province。不需要计算属性或监视程序。@FINDarkside我不认为这是真的。在我的情况下,直接绑定时不会更新属性。。。最初,数据由子组件中的空值填充,当更新父组件中的location.province时,它不会反映在子组件中。。。或者我遗漏了什么?@Decade Moon如果我没有一个对象作为属性传递,而只是一个值:比如
,我希望在子(
位置
)组件中更改省值,我认为计算属性也不起作用。对吗?观看事件并没有帮助。。。我能不能让原始类型的道具成为被动的?@Merc如果你通过道具向下传递一个原始值,它不能由子道具直接更新。子级“更新”它的唯一方法是向父级发出事件(
this.$emit('update:province',value)
),以便父级可以更新它。这一点在《十诫》中有解释,我确实知道,但我希望情况正好相反。父对象将初始属性(原语)传递给子对象,然后更新其值。然后,它应该通知子对象,并且应该更新该原语。所以这确实是写在标题中的问题,但在我的例子中,我有原语。。。
<location :location.sync="_.deepClone(loc)"></location>