vue3【实战】可撤销重做的 input 输入框

效果预览

在这里插入图片描述

实现思路

  • 用 list 数组保存每次输入后输入框的值(响应 input 事件)
  • 用 indexRef 作为指针,指向当前 list 数组中对应当前输入框的值
  • 撤销时,指针左移
  • 重做时,指针右移
  • 输入时,对 list 数组按指针+1做截取,清除被撤销掉的输入框的值
  • 用 disabled 属性控制撤销和重做按钮的边界情况
  • 用 focus 避免失焦

代码实现

<template>
  <div>
    <!-- 4-5行代码仅供调试使用 -->
    <!-- <p>indexRef 的值:{{ indexRef }}</p>
    <p>list 的值:{{ list }}</p>
    <p>list.length 的值:{{ list.length }}</p> -->

    <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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝阳39

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值