【发布时间】:2018-04-16 06:06:52
【问题描述】:
我正在尝试制作一个多文本输入组件。有一个父 Vue 组件来管理单个字段和一个用于单个输入的组件。
父组件通过绑定到对象数组的 v-for 渲染子组件。
data() {
return {
lastItemId: 0,
items: [{ id: this.lastItemId, value: '', showDeleteBtn: false}]
}
},
模板:
<div>
<input-item v-for='(item, index) in items'
:key="item.id"
:default-data="item"
@itemAdded="addItemAfter(index)"></input-item>
</div>
每当用户开始在列表的最后一个字段中输入内容时,我都会发出一个事件以在其后添加一个新的文本字段。
addItemAfter(index) {
if (index == this.items.length - 1) {
this.items.push({
id: ++this.lastItemId,
value: '',
showDeleteBtn: false
});
}
}
这很好用。但是,我还需要更新当前索引处的项目以在该字段附近显示删除按钮。无论我做什么,Vue 都不会重新渲染该组件,除非我为该索引设置了一个具有不同 ID 的对象——这不是我想要的。
我尝试过的事情:
this.items[index].showDeleteBtn = true;
let item = this.items[index];
item.showDeleteBtn = true;
this.$set(this.items, index, item);
let item = this.items[index];
item.showDeleteBtn = true;
this.items.splice(index, 1, item);
this.$set(this.items[index], 'showDeleteBtn', true);
更新
这是这个问题子组件中最重要的部分:
<button class="btn text-danger" v-show="showDeleteBtn" @click.prevent="removeItem">
<i class="glyphicon glyphicon-remove"></i>
</button>
// ....................................
props: ['defaultData'],
data() {
return {
itemId: this.defaultData.id,
item: this.defaultData.value,
showDeleteBtn: this.defaultData.showDeleteBtn
}
},
【问题讨论】:
-
好吧,v-for 不必重新渲染 - 数组没有改变。
input-item组件必须重新渲染,并且看起来不需要。那么你能分享他们的代码/标记吗? -
我更新了问题。
-
data方法中设置的属性在初始化时设置一次。它们不会更新以响应defaultData属性的更改。 -
用computed()代替怎么样?
-
澄清一下:
defaultDataprop 的值将随着绑定到 prop 的item值的变化而更新。但是data方法不会再次被调用来更新showDeleteBtn数据属性。您可以使用计算的,或者只指定一个showDeleteBtn属性并通过:show-delete-btn="item.showDeleteBtn"
标签: javascript vue.js vuejs2