起因
很久之前测试给我提了个bug,用数组渲染多个ace编辑器,将遍历数组完全更改,会出现编辑器部分内容没有更新。
等鼠标聚焦到编辑器才显示,我怀疑是key导致了组件更新问题,于是粗暴的把key加上了UUID(一种很难重复出现
的随机数)。问题迎刃而解,但是真的没问题了吗。
困惑
不久后出现了新的bug,编辑器光标无法找到正确的定位,每次编辑后光标总是定位在末尾。查看打印发现了如上的报错。Cannot read property ‘getTokens’ of null。起初我以为是编辑器本身的问题,花了很多时间在其中找问题,之前改的那个问题并没有给我留下很深的印象,只当是个小bug.(换版本,看文档,看源码。。。)一系列操作后发现问题并没有解决,当我准备休息换换思路,偶然发现了在key上的UUID,一个猜想出现在脑海。
解决方案
我把key换回了原来的数组下标,果然不再报错。但是渲染更新的问题呢?于是我把UUID直接放在reducer中添加,如果数组元素没有uuid属性就添加(初始的state也要添加),然后key绑定uuid.
总结
编辑器报错的原因是每次更新渲染的时候,key都不一样,那么原来的dom和编辑器都会被销毁,生成新的编辑器,之前编辑器里保存的状态如光标位置等状态信息也都没有了,所以才会出现问题。所以使用随机数作为key值真的是个很糟糕的主意