【发布时间】:2020-08-30 16:51:15
【问题描述】:
来自 Vue 文档:
prop 作为需要转换的原始值传入。在 在这种情况下,最好使用 prop 定义一个计算属性 价值。
如果这个“道具”是对象数组怎么办?我试图根据文档将其转换为计算数组。那怎么变异呢?
在下面的示例中,组件接受项目数组Array<{ ID: string, lettering: string; }>。
组件为每个项目呈现按钮。
- 当我们点击按钮时,它必须改变颜色。
- 如果我们再次单击相同的按钮,它必须返回到初始状态。
<template>
<div>
<button
v-for="(item, index) in selectableItems"
:key="`BUTTON-${item.ID}`"
:class="{ selected: item.selected }"
@click="() => {onButtonClicked(item, index) }"
> {{ item.lettering }}
</button>
</div>
</template>
我从items 计算selectableItems。除了 item 的属性之外,selectableItems 还具有属性 selected。
export default {
name: "HelloWorld",
props: {
items: Array
},
computed: {
selectableItems: function () {
const selectableItems = [];
this.items.forEach((item) => {
selectableItems.push({
ID: item.ID,
lettering: item.lettering,
selected: false
});
});
return selectableItems;
}
},
methods: {
onButtonClicked: function(item, index) {
if (item.selected) {
this.selectableItems[index].selected = false;
} else {
this.selectableItems[index].selected = true;
}
console.log(this.selectableItems);
}
}
};
目前,Vue 不会重新渲染按钮。
我知道 getter 的 mutate 使用不当。 但是我应该如何改变数组呢?
禁解
不允许通过props 而不是{ ID: string, lettering: string; } 传递{ ID: string, lettering: string; selected: boolean; }。 { ID: string, lettering: string; }是纯模型,一定不知道UI。 selected: boolean; 仅用于 UI。
【问题讨论】:
-
您的解决方案将不起作用,因为您尝试操作计算的道具,该道具在重新计算时将被简单地覆盖。您需要将元素的选定状态存储为数据,以使其正常工作。如果你的数组中有不变的索引,你可以使用这些。或者你在你的 props 上创建一个观察者,并将 props 中给出的所有数据存储为你的本地数据,并在更改时不断更新它
-
@FrankProvost,感谢您的评论。 “您需要将元素的选定状态存储为数据,以使其正常工作。” - 但如何?从 Vue API 的角度来看,这并不明显。
标签: javascript vue.js