文章目錄
前言
一、DOM更新優化機制
?1.虛擬DOM復用性
2.?響應式系統觸發
二、性能對比
三、WebSocket場景實踐
?1.防閃爍原理
2.代碼實現示例
四、特殊注意事項
總結
前言
開發過程中渲染websocket返回的數據時,經常會遇到更新數據閃爍的問題,咱們可以通過splice實現局部更新,避免整列表重渲染。
一、DOM更新優化機制
?1.虛擬DOM復用性
- 直接替換整個數組會導致虛擬DOM重新生成所有節點,而
splice
僅修改特定索引元素,保留未變動節點的復用性?。 - 示例場景:當WebSocket推送[88, 92, 95]時,僅更新第二個元素值而非全量替換數組?。?
2.?響應式系統觸發
- Vue 2中直接通過索引賦值(如
arr?:ml-citation{ref="1" data="citationList"}=newValue
)無法觸發視圖更新,必須使用splice
或Vue.set
確保響應式追蹤?。 - Vue 3的Proxy機制雖支持索引賦值,但
splice
仍能更精準控制更新范圍?。
二、性能對比
操作方式 | 內存占用 | DOM操作次數 | 適用場景 |
直接賦值 | 高 | 全量替換 | 數據完全變更時 |
splice | 低 | 局部更新 | 部分數據增量更新 |
三、WebSocket場景實踐
?1.防閃爍原理
- 全量替換會導致短暫白屏(舊DOM移除與新DOM創建間隙),
splice
保持現有DOM結構僅更新文本內容?。 - 配合
<transition-group>
可實現平滑過渡動畫?。
2.代碼實現示例
代碼如下(示例):
/**
* @description:處理Websocket的數據
* @return {*}
*/
pushData(wsData) {const nowData = wsData.dictMap[0]const map = new Map(Object.entries(nowData))this.paramList.forEach((item, index) => {if (map.has(item.id)) {this.paramList.splice(index, 1, {id: item.id,name: item.name,value: map.get(item.id)})}})
},
四、特殊注意事項
- ?大數組優化?:超過1000條數據時建議使用
requestAnimationFrame
分批次splice
更新?。 - ?Vue 3組合式API?:推薦使用
toRaw
獲取原始數組后再執行splice
操作,避免響應式代理開銷。 - 使用
watch
?:復雜數據結構建議使用watch
深度監聽配合splice。
總結
在Vue中使用splice
方法優化渲染主要通過精準控制數組更新范圍來實現,splice
觸發的更新會被加入異步隊列批量處理,與WebSocket高頻特性完美契合?。