Vue 如何追蹤數(shù)據(jù)變化
背景
工作中時不時就會遇到這種情況:頁面上顯示的數(shù)據(jù)不對,需要前端同事進行定位。
在一個使用 Vue 搭建的 SPA 應用上,頁面最終展示的數(shù)據(jù),從初始化,到最后的展示,過程可能很簡單,也可能很復雜。遇到復雜的數(shù)據(jù)流,沒有合適的方法,排查起來會很頭疼。
如果能夠看到數(shù)據(jù)發(fā)生變化時的調(diào)用棧,就可以知道在錯誤的數(shù)據(jù)生成前,發(fā)生了什么,是哪一步的錯誤,導致了最終的錯誤。順著調(diào)用棧給出的線索找下去,就能夠快速定位到問題。
例子
<template> <div> <!-- 預期輸出:hello,world --> <!-- 實際輸出:hello,woold --> {{ msg }} <button @click="f1">change msg</button> </div> </template> <script> export default { data() { return { msg: 'hello,', } }, methods: { f1() { this.msg += 'w' this.f2(); }, f2() { this.msg += 'oo'; this.f3(); }, f3() { this.msg += 'ld' } } }; </script>
誤區(qū) - 在 Watch 里打斷點查看調(diào)用棧
我們可以在頁面右邊的 Call Stack 看到 f1 和 msg 的回調(diào),但是看不到 f2 和 f3。也就是說 f2, f3 丟失了,但實際上正是 f2 導致數(shù)據(jù)發(fā)生了錯誤。
為什么 f2,f3 的調(diào)用信息會丟失?
因為 f1, f2, f3 都修改了 msg,在同一個微任務里觸發(fā)了 msg 的 Watcher,因為 f1 最先觸發(fā),所以f2,f3 的觸發(fā)無效。最終 Watcher 回調(diào)運行的時候,只記得是 f1 觸發(fā)它的,所以此時的 Call Stack 只能看到 f1 的信息。
正確的做法
進入到 node_modules\vue\dist\vue.runtime.esm.js,在 defineReactive 函數(shù)的 set 方法里添加斷點,這里的 key 就是要監(jiān)聽的變量的名字。
在這里,就能夠看到 msg 發(fā)生變化的完整過程,快速定位到是 f2 導致的問題。
總結(jié)
通過查看調(diào)用棧的方式,不需要對項目有多熟悉,就能夠快速定位到數(shù)據(jù)發(fā)生錯誤的地方。相比于用 console.log 或者花很多時間去理清代碼邏輯,數(shù)據(jù)流的方式,可以減少很多的工作量。
以上就是Vue 如何追蹤數(shù)據(jù)變化的詳細內(nèi)容,更多關(guān)于Vue 追蹤數(shù)據(jù)變化的資料請關(guān)注腳本之家其它相關(guān)文章!
- Vue2.0/3.0雙向數(shù)據(jù)綁定的實現(xiàn)原理詳解
- 關(guān)于vuex強刷數(shù)據(jù)丟失問題解析
- vue+canvas實現(xiàn)數(shù)據(jù)實時從上到下刷新瀑布圖效果(類似QT的)
- vue 數(shù)據(jù)(data)賦值問題的解決方案
- Vue 重置data的數(shù)據(jù)為初始狀態(tài)操作
- Vue組件傳值過程中丟失數(shù)據(jù)的分析與解決方案
- SpringBoot+Vue實現(xiàn)數(shù)據(jù)添加功能
- 手寫Vue2.0 數(shù)據(jù)劫持的示例
- vue 數(shù)據(jù)雙向綁定的實現(xiàn)方法
- Vue中避免濫用this去讀取data中數(shù)據(jù)
- 用vue設(shè)計一個數(shù)據(jù)采集器
相關(guān)文章
使用Vue-Router 2實現(xiàn)路由功能實例詳解
vue-router 2只適用于Vue2.x版本,下面我們是基于vue2.0講的如何使用vue-router 2實現(xiàn)路由功能,需要的朋友可以參考下2017-11-11vue-cli基礎(chǔ)配置及webpack配置修改的完整步驟
這篇文章主要給大家介紹了關(guān)于vue-cli基礎(chǔ)配置及webpack配置修改的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用vue-cli具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-10-10vue組件中節(jié)流函數(shù)的失效的原因和解決方法
這篇文章主要介紹了vue組件中節(jié)流函數(shù)的失效和解決方法,幫助大家更好的理解和學習vue框架,感興趣的朋友可以了解下2020-12-12