今天在实现一个可编辑树形结构demo时,碰到了一个奇怪的bug。这个demo使用的是elemen-plus中的树形控件,在此组件的基础上进行累加功能,希望的效果是当我鼠标右击树形组件中的任意节点时,该节点就变成输入框形式,输入完成后再按回车就保存。
问题
实际完成的过程中出现了bug,当节点变成输入框时,我只要按下任意一个键,就会卡住(输入框失去焦点),如下:
解决
仔细检查了代码后没发现问题,感觉这个可能是内部组件所产生的,然后我想到之前一种查看源码的debug方式,根据记忆实践了一遍:
- 第一是找到出现问题的dom节点,我这是input输入框,定位到后找到事件监听器,如下:
其中keyup事件是我绑定的回车按键,就不用看了,主要看change和input,点右边的蓝色字体就可以直接定位到具体代码,(点进去发现看不懂,就不看了)。
- 到这里好像还是不知道问题出在哪,下一步,只能直接粗暴点了,把这些事件挨个移除,看具体是哪个事件出问题了,首先我移除change事件发现还是会让输入框失去焦点,然后移除input事件之后,发现正常了,所以这个问题就是应该出在这个自带的input事件上,点进去之后看一看源码。
- 直接定位到了这一行,关键代码,大概解读一下,就是说这是一个vModelText指令,然后给这个元素添加监听事件,然后判断是否有"lazy"这个修饰词,如果有,就是监听"change"事件,如果没有则监听"input"事件,在更新之前,再判断一下是不是懒监听,如果是,就直接return,暂时先不更改值。(这里分别对应created、addEventListener、beforeUpdate中的函数,其他的有兴趣可以额外看看)。
- 到这里截止,基本就搞懂了这个问题出在哪,再对应看看vue官方文档,全局搜一下lazy关键字,也差不多是这样解释的
正常运行的情况