【发布时间】:2018-08-21 21:22:58
【问题描述】:
我的主应用程序中有一个 Modal 组件,每当必须显示模式时,它都会通过事件获取传递的内容。模态内容始终是一个列表,其中包含与每个项目关联的操作,例如“选择”或“删除”:
Vue.component('modal', {
data() {
return {
shown: false,
items: [],
callback: ()=>{}
}
},
mounted() {
EventBus.$on('showModal', this.show);
},
template: `<ul v-if="shown">
<li v-for="item in items">
{{ item }} <button @click="callback(item)">Remove</button>
</li>
</ul>`,
methods: {
show(items, callback) {
this.shown = true;
this.items = items;
this.callback = callback;
}
}
});
遗憾的是,当像下面的组件一样将计算属性传递给该模式时,反应链接会被破坏 -> 如果操作是“删除”,则列表不会更新。
Vue.component('comp', {
data() {
return {obj: {a: 'foo', b: 'bar'}}
},
computed: {
objKeys() {
return Object.keys(this.obj);
}
},
template: `<div>
<button @click="showModal">Show Modal</button>
<modal></modal>
</div>`,
methods: {
remove(name) {
this.$delete(this.obj, name);
},
showModal() {
EventBus.$emit('showModal', this.objKeys, this.remove);
}
}
});
查看此小提琴中的最小用例:https://jsfiddle.net/christophfriedrich/cm778wgj/14/
我认为这是一个错误 - Vue 不应该记住 objKeys 用于在 Modal 中进行渲染并更新它吗? (将obj 更改为objKeys 的转发有效。)如果没有,我哪里做错了,我怎样才能达到我想要的结果?
【问题讨论】:
-
您正在删除对象属性,vue 不监视...您应该添加一个监视程序
-
我不认为这是一个错误。确实需要一个观察者。
-
两个组件之间的观察者或共享状态:vuejs.org/v2/guide/…
-
@samayo Vue 在我使用 $delete 函数时确实注意到了这一点 - 至少我是这么理解的 vuejs.org/v2/api/#Vue-delete 你看我的小提琴了吗?
comp的模板中的渲染更新得非常好。
标签: javascript vue.js vuejs2 vue-reactivity