Vue里怎么实现撤销操作?数据变了但视图没更新怎么办?
我在做一个简单的画布编辑功能,点击按钮会修改 items 数组,想加个撤销功能,但用 push 和 pop 操作 history 之后,页面不重新渲染了,明明数据已经变了啊?
我试过用 $forceUpdate(),也试过把整个数组替换成新数组,还是不行,是不是哪里搞错了?
<template>
<div>
<p v-for="item in currentItems" :key="item.id">{{ item.text }}</p>
<button @click="addItem">添加</button>
<button @click="undo" :disabled="history.length <= 1">撤销</button>
</div>
</template>
push和pop会改变数组,但如果只是简单地替换数组的内容,Vue 可能不会意识到需要重新渲染视图。你可以通过使用 Vue 提供的数组变异方法或者直接替换整个数组的方式来解决这个问题。不过,这里有一个更好的办法——使用 Vue 的
Vue.set或者直接返回一个新的数组来触发视图更新。下面是一个改进后的示例:这样更清晰。通过每次操作都创建一个当前状态的快照并将其推入历史记录数组,然后在撤销操作时恢复到上一个状态,可以确保 Vue 能够检测到数组的变化并更新视图。这样既实现了撤销功能,又避免了手动强制更新视图的麻烦。