【发布时间】:2018-06-27 04:23:58
【问题描述】:
我有一个组件,它的 location 对象为 props。我传入的参数是locations[index],它是从locations 数组中选择的项目。
但是,当index 更改时,组件无法做出反应。正如您在演示中看到的那样,当您单击按钮时,JSON 会发生变化,但组件无法更新。
使组件具有响应性的最佳方法是什么?
【问题讨论】:
标签: vue.js vuejs2 vue-component
我有一个组件,它的 location 对象为 props。我传入的参数是locations[index],它是从locations 数组中选择的项目。
但是,当index 更改时,组件无法做出反应。正如您在演示中看到的那样,当您单击按钮时,JSON 会发生变化,但组件无法更新。
使组件具有响应性的最佳方法是什么?
【问题讨论】:
标签: vue.js vuejs2 vue-component
您的location 组件仅在mounted 挂钩中填充province 和city 数据属性。当 location 属性发生变化时,mounted 钩子将不会被再次调用,所以你会留下陈旧的数据。
改用计算属性:
computed: {
province() {
return this.location.province;
},
city() {
return this.location.city;
}
}
如果您确实需要 province 和 city 是数据属性(而不是计算属性),那么您需要观看 location 属性来更新属性:
data() {
return {
province: null,
city: null
}
},
watch: {
location: {
immediate: true,
handler(loc) {
this.province = loc.province;
this.city = loc.city;
}
}
}
【讨论】:
<Location :province="location.province" />,我希望在孩子中更改省值 (Location)组件,我认为计算属性也不起作用。那是对的吗?事件观察无济于事......我可以以某种方式使原始类型的道具反应吗?
this.$emit('update:province', value)) 发出一个事件,以便父母可以更新它。这在docs 中有解释。
你的 prop location 中的嵌套项目不会是反应式的,你需要使用类似 lodash deepClone 的东西:
<location :location.sync="_.deepClone(loc)"></location>
就是这样,不需要观察者或其他任何东西。
【讨论】: