简介
在某些需求中,用户需要让客户端的节点频繁刷新,实时与服务端保持一致,本篇文章将对实现这个功能做一个较完整的分析。
一、最原始的方法
优点:
- 无需修改后台接口
- 代码逻辑相对简单,利于初学者入门
缺陷:
- 刷新过程 树 一定会闪一下
- 如果不重新设置 open 属性,就会导致每次刷新后,用户又要重新展开那些已经展开的节点
- 不适合异步加载模式后,代码会非常麻烦
- 定时刷新数据,不管后台是否有改变都要重新刷新一遍
二、改善策略
定时更新数据的优化
用一个 setTimeout 或 setInterval 实现定时执行的方法,不可避免会导致大量无用的请求。如果你们的项目比较前卫,而且不用考虑老旧的浏览器,那么可以使用HTML5 的新技术:websocket
,用上 websocket 后,就可以实现后台有修改的时候才会主动推送消息(push)给页面用于显示。
后台生成数据的优化
每次都生成全部的数据是一种浪费,尤其是当你使用了异步加载模式后,就会大大增加恢复树显示的复杂程度。建议除了第一次加载之外,之后仅仅生成增量的数据。
- 使用 js 定时刷新的情况下,每次根据上一次的版本号去获取新版本号的节点数据
- 使用 websocket 推送的情况下,由服务器记录上一次推送的版本号,并在下次推送时根据其获取最新修改的节点数据
使用推送功能时,可以根据自己项目以及技术架构的情况,确定是否每一次修改都推送,还是积累一部分修改再一起推送
- 增量数据应该分为三部分:新增、修改、删除
其中 新增、修改的数据需要完整数据;删除的只需要节点 id 即可
- 对于需要新增、删除的数据,分别使用 addNodes、removeNode 方法即可
- 对于需要修改的节点,直接找到对应节点数据,然后修改属性值,最后使用 updateNode 方法更新视图即可
三、最优方案
结合上面的改善策略,就有了最优方案,使用这种方案,你的树绝对不会再闪,而且还能及时显示后台的更新,相信追求完美的你会愿意与你的同事一起努力来实现这种效果的。