在可编辑树组件中碰到的问题

78 阅读2分钟

今天在实现一个可编辑树形结构demo时,碰到了一个奇怪的bug。这个demo使用的是elemen-plus中的树形控件,在此组件的基础上进行累加功能,希望的效果是当我鼠标右击树形组件中的任意节点时,该节点就变成输入框形式,输入完成后再按回车就保存。

问题

实际完成的过程中出现了bug,当节点变成输入框时,我只要按下任意一个键,就会卡住(输入框失去焦点),如下: 树形_问题.gif

解决

仔细检查了代码后没发现问题,感觉这个可能是内部组件所产生的,然后我想到之前一种查看源码的debug方式,根据记忆实践了一遍:

  • 第一是找到出现问题的dom节点,我这是input输入框,定位到后找到事件监听器,如下: 其中keyup事件是我绑定的回车按键,就不用看了,主要看change和input,点右边的蓝色字体就可以直接定位到具体代码,(点进去发现看不懂,就不看了)。 step1.png
  • 到这里好像还是不知道问题出在哪,下一步,只能直接粗暴点了,把这些事件挨个移除,看具体是哪个事件出问题了,首先我移除change事件发现还是会让输入框失去焦点,然后移除input事件之后,发现正常了,所以这个问题就是应该出在这个自带的input事件上,点进去之后看一看源码。 step2.png
  • 直接定位到了这一行,关键代码,大概解读一下,就是说这是一个vModelText指令,然后给这个元素添加监听事件,然后判断是否有"lazy"这个修饰词,如果有,就是监听"change"事件,如果没有则监听"input"事件,在更新之前,再判断一下是不是懒监听,如果是,就直接return,暂时先不更改值。(这里分别对应created、addEventListener、beforeUpdate中的函数,其他的有兴趣可以额外看看)。 step3.png
  • 到这里截止,基本就搞懂了这个问题出在哪,再对应看看vue官方文档,全局搜一下lazy关键字,也差不多是这样解释的 step4.png

正常运行的情况

树形_解决.gif