效果预览
实现思路
- 用 list 数组保存每次输入后输入框的值(响应 input 事件)
- 用 indexRef 作为指针,指向当前 list 数组中对应当前输入框的值
- 撤销时,指针左移
- 重做时,指针右移
- 输入时,对 list 数组按指针+1做截取,清除被撤销掉的输入框的值
- 用 disabled 属性控制撤销和重做按钮的边界情况
- 用 focus 避免失焦
代码实现
<template>
<div>
<input ref="inputRef" type="text" @input="inputStr" v-model="valueRef" />
<button @click="undo" :disabled="indexRef < 0">撤销</button>
<button @click="redo" :disabled="indexRef === list.length - 1">重做</button>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
let list = reactive([]);
let indexRef = ref(-1);
let valueRef = ref("");
let inputRef = ref(null);
let inputStr = () => {
list.length = indexRef.value + 1;
list.push(valueRef.value);
indexRef.value++;
};
function undo() {
indexRef.value--;
valueRef.value = list[indexRef.value];
inputRef.value.focus();
}
let redo = () => {
indexRef.value++;
valueRef.value = list[indexRef.value];
inputRef.value.focus();
};
</script>