【发布时间】:2019-06-19 23:34:06
【问题描述】:
我有类似的问题: VueJs 2.0 - how to listen for `props` changes 但在我的情况下,我将对象从父级发送到子级,同时传递了几次以使用 JS 中对象引用的好处。
有一个例子,但工作正常:
<div id="app">
<child :myprop="myObj"></child>
<button @click="text = 'Another text'">Change text</button>
</div>
<script>
new Vue({
el: '#app',
data: {
myObj: {
id: null
}
},
components: {
'child' : {
template: `<div>
<p>{{ myprop.id }}</p>
<select v-model="myprop.id">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</div>`,
props: ['myprop'],
watch: {
'myprop.id': function(newVal, oldVal) { // watch it
console.log('Prop changed: ', newVal, ' | was: ', oldVal)
}
}
}
}
});
</script>
https://jsfiddle.net/8hqwg6Ln/
在我的例子中,我将 v-model on select 设置为“parentObj.id”,然后为此添加观察者。目标是在更改 id 后更改其他 parentObj 属性 - 用户选择 id,然后我在我的数组中搜索此 id 并将 parentObj.price 设置为与选择字段相同级别的其他组件(修改输入)的 v-model .
当我改变选择时,观察者不会被触发。如果我用我的自定义方法添加@change,它可以工作,但有延迟(我在 vue 开发工具中看到了这个,必须刷新才能获取当前数据),而且,它不适用于第二个输入组件 - 它看不到更改 parentObj.price。
使用复杂集合并向下传递和修改具有许多不同组件的集合的最佳方法是什么? 我认为,我可以将属性的“副本”添加到本地级别(因此,创建具有 id 和孩子价格的数据),添加观察者,并使用 this.$set 更新收到的道具。但是......这是一个不错的选择,也许这里有更好的选择?
【问题讨论】:
标签: javascript vue.js vuejs2 vue-component pass-by-reference