【发布时间】:2017-03-01 19:22:41
【问题描述】:
这是我的代码的简化版本:
Vue.component('entry', {
template: '\
<div>\
<label>Name: <input type="text" v-model="entry.name"></label>\
</div>\
',
props: ['entry']
});
Vue.component('entries', {
template: '\
<div>\
<entry v-for="entry in entries" :entry="entry"></entry>\
<pre>{{ combined }}</pre>\
</div>\
',
props: ['entries'],
computed: {
combined: function() {
combined = [];
this.entries.forEach(function(entry) {
combined.push(entry.name);
});
return combined.join("\n");
}
}
});
var entries = [
{name: "Entry 1"},
{name: "Entry 2"},
{name: "Entry 3"}
];
这里的JSFiddle:https://jsfiddle.net/msw3Lx98/3/
顶级组件 (entries) 获取对象列表,并为每个对象创建一个子组件 (entry)。子组件将条目数据绑定到输入。
当用户通过键入其中一个输入来修改数据时,顶级组件需要将 combined 的更新值推送到单独的代码位。
我对观察者模型的理解是,如果顶级组件观察entries,它可以检测到何时将事物添加到列表中或从列表中删除,但不能检测到条目中的数据何时发生变化.
然而,顶层组件显然确实以某种方式看到了这种变化,因为当用户输入输入时,combined 的值会更新。
是否有“正确”的方法来检测这种变化?
以下是我探索过的几个选项:
- 在子组件上定义
updated方法。在该方法中发出一个自定义事件,并在父级中处理此事件。这相当尴尬,我认为它不会很好地扩展。 - 在父组件上定义一个
beforeUpdate方法——只要子组件发生变化,这个(但不是updated)就会运行。我不知道为什么,而且我觉得味道不对。 - 在顶级组件中,观察
combined属性。我有点惊讶这行得通,但确实如此。这似乎是最直接的选择,但从 Vue 文档中并没有明显看出计算属性是为了可观察的,所以我不愿意依赖它。
【问题讨论】:
标签: vue.js vue-component