我有一个关于创建可使用的 VueJS 组件的问题,这些组件v-model
利用底层的value
prop 和$emit('input', newVal)
.
props: {
value: Array
},
methods: {
moveIdToIndex (id, newIndex) {
const newArrayHead = this.value
.slice(0, newIndex)
.filter(_id => _id !== id)
const newArrayTail = this.value
.slice(newIndex)
.filter(_id => _id !== id)
const newArray = [...newArrayHead, id, ...newArrayTail]
return this.updateArray(newArray)
},
updateArray (newArray) {
this.$emit('input', newArray)
}
}
在上面的代码示例中,如果我快速连续进行两次修改,它们都将在“旧数组”(未修改的value
道具)上执行。
moveIdToIndex('a', 4)
moveIdToIndex('b', 2)
换句话说,我需要等待value
通过 更新$emit('input')
,以便第二次调用moveIdToIndex
使用已修改的数组。
错误的解决方案 1
一种解决方法是更改updateArray
为:
updateArray (newArray) {
return new Promise((resolve, reject) => {
this.$emit('input', newArray)
this.$nextTick(resolve)
})
}
并像这样执行:
await moveIdToIndex('a', 4)
moveIdToIndex('b', 2)
但我不想这样做,因为我需要对一组 Id 执行此操作,并同时将它们全部移动到不同的位置。而await
ing 会大大降低性能。
错误的解决方案 2
我发现一个更好的解决方案就是这样做:
updateArray (newArray) {
this.value = newArray
this.$emit('input', newArray)
}
然后我根本不需要等待$emit
完成。
然而,在这种情况下,VueJS 给出了一个控制台错误:
避免直接改变 prop,因为只要父组件重新渲染,该值就会被覆盖。相反,使用基于道具值的数据或计算属性。道具被变异:“价值”
有没有人有更好的解决方案?