学会用Vue.js 自己手写一个快捷键的功能

1,731 阅读2分钟

前言

大家好,我是小张同学,今天是周六,又不知不觉的摸鱼了五天,时间可真快,下个星期咱继续摸鱼,哈哈哈,今天给大家分享的是,自己手写一个快捷键的功能,例如 ctrl+C(复制文本) , ctrl+S(保存当前编辑的内容)等等, 如果你觉的有用请点个Star,谢谢。

问题的起因

我正在做一个绘制流程图的一个项目,其主要作用就是绘制一些事情的整体流程,说来也巧,我们老大,让我自由发挥,所以我输出全靠自己幻想,大概是下面这个样子,可以看到有 剪切 ,复制 粘贴 编辑等等功能。

image.png 技术栈 :Vue2全家桶json-serveraxiosvuedraggable,jsPlumb,等等

1:vuedraggable(一个能让节点可拖拽的库): 给大家附上中文文档可以去学习一下www.itxst.com/vue-draggab…

2:jsPlumb(一个能让节点连接的库):也给大家附上中文文档,学习一下 wdd.js.org/jsplumb-chi…

实现原理

其实我们做快捷键功能很简单,主要就是监听我们的键盘事件,当用户按下某些键时,去执行某些操作,接下来我们就开始写代码。

写代码

由于我们是在用vue进行全局键盘事件监听,所以监听键盘事件你可能需要在生命周期中进行监听

  created(){ /* 监听键盘事件*/   this.Shortcuts()},
  
  methods:{
       Shortcuts() {
       //定义一个变量 方便后面保存 事件对象
       let $Event = undefined;
      document.addEventListener("keydown", (e) => {
        // 将事件对象保存 
        $Event = e;
        // 将用户按下的键同义转换成大写
        const keyCode = $Event.key.toLocaleUpperCase();
        //
        `这里 比较重要 ,如果用户按下了 ctrl 键 
         那事件对象中ctrlKey 或者metaKey 状态都会变为 true
         这也是我们实现快捷键的最高效的方式   `
        const ctrlKey = $Event.ctrlKey || e.metaKey;
        //保存 用户按下的键,方便后续出传值
        const ShortcuGroupKey = { keyCode, ctrlKey };
        // 对应快捷键的方法,将用户按下的键传值传进去
        CtrlS(ShortcuGroupKey);
        CtrlD(ShortcuGroupKey);
        CtrlC(ShortcuGroupKey);
        CtrlV(ShortcuGroupKey);
        CtrlX(ShortcuGroupKey);
        // 如果用户按下的是一个键的话把 按下的键盘码传进去就好了
        Delete(keyCode);
      });
      // 封装一个方法 统一 取消默认行为
      const CancelPreventDefault = () => $Event.preventDefault();
      
     /* `封装一个工具函数 ,传键盘按下的键码和你想要匹配的键的字符和 需要调用的方法
     判断你按下的键和我传的键是否相等,如果相等 我调用刚刚传进来的方法`*/
      
      const ShortcuCtrls = (val, fn) => {
        const { ctrlKey, keyCode, ShortcuKey } = val;
        if (ctrlKey && keyCode === ShortcuKey) {
        //如果你按下的键和我相等 则调用该方法 其实这里最好的调用是
          fn();
          // 调用成功后取消默认行为 用我自己写的快捷键功能
          CancelPreventDefault();
        }
      };
      // 下面就是 每个快捷键 需要执行的操作
      
     // 我 ctrl + S 实现了 当前文档保存的功能
      
      const CtrlS = (val) =>
        ShortcuCtrls({ ...val, ShortcuKey: "S" }, this.SaveAll);
       //我这里Ctrl + D 是一个编辑功能
      const CtrlD = (val) =>
        ShortcuCtrls({ ...val, ShortcuKey: "D" }, this.EditNodeInfo);
        
      const CtrlC = (val) =>
        ShortcuCtrls({ ...val, ShortcuKey: "C" }, this.copyNode);
      const CtrlV = (val) =>
        ShortcuCtrls({ ...val, ShortcuKey: "V" }, this.pasteNode);
      const CtrlX = (val) =>
        ShortcuCtrls({ ...val, ShortcuKey: "X" }, this.shearNode);
      const Delete = (keyCode) => {
        if (keyCode === "DELETE") {
          this.deleteNode(this.CurrntNode || {}), CancelPreventDefault();
        }
      };
    },
        }

如何匹配用户按下键的操作?

image.png CTRL + S image.png 这是我 ctrl + s 的业务逻辑,你需要编写自己的业务逻辑。

         //保存全局的状态
              SaveAll(){
               try {
                if(this.SaveState)return
                // 每次保存调用一下子组件保存的方法
                this.$refs.nodeForm.save()
                this.SavePanel('保存成功')
                this.SaveState = true
               } catch (error) {
                
               }
              },
              
             async SavePanel(message){
              await axios.put(`/Process/${this.CurrentProcessPanel.id}`,{
              id:`${this.CurrentProcessPanel.id}`,
              name:this.CurrentProcessPanel.name,
              nodeList:this.data.nodeList,
              lineList:this.data.lineList
              })
              this.$message.success(message)
              // this.dataReloadB()
              // this.LoadPanelInfo(this.CurrentProcessPanel.id ,this.CurrentProcessPanel.name)
            },

CTRL + D

ctrld.gif

大致快捷键完成的效果

process.gif

当然后续我还需要补上 ctrl + a 全选功能 ctrl + z 回退功能等等,期待和大家一起分享,期待你的Star 谢谢