Vue 如何追蹤數(shù)據(jù)變化
背景
工作中時(shí)不時(shí)就會遇到這種情況:頁面上顯示的數(shù)據(jù)不對,需要前端同事進(jìn)行定位。
在一個(gè)使用 Vue 搭建的 SPA 應(yīng)用上,頁面最終展示的數(shù)據(jù),從初始化,到最后的展示,過程可能很簡單,也可能很復(fù)雜。遇到復(fù)雜的數(shù)據(jù)流,沒有合適的方法,排查起來會很頭疼。
如果能夠看到數(shù)據(jù)發(fā)生變化時(shí)的調(diào)用棧,就可以知道在錯(cuò)誤的數(shù)據(jù)生成前,發(fā)生了什么,是哪一步的錯(cuò)誤,導(dǎo)致了最終的錯(cuò)誤。順著調(diào)用棧給出的線索找下去,就能夠快速定位到問題。
例子
<template>
<div>
<!-- 預(yù)期輸出:hello,world -->
<!-- 實(shí)際輸出: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ǎn)查看調(diào)用棧

我們可以在頁面右邊的 Call Stack 看到 f1 和 msg 的回調(diào),但是看不到 f2 和 f3。也就是說 f2, f3 丟失了,但實(shí)際上正是 f2 導(dǎo)致數(shù)據(jù)發(fā)生了錯(cuò)誤。
為什么 f2,f3 的調(diào)用信息會丟失?
因?yàn)?f1, f2, f3 都修改了 msg,在同一個(gè)微任務(wù)里觸發(fā)了 msg 的 Watcher,因?yàn)?f1 最先觸發(fā),所以f2,f3 的觸發(fā)無效。最終 Watcher 回調(diào)運(yùn)行的時(shí)候,只記得是 f1 觸發(fā)它的,所以此時(shí)的 Call Stack 只能看到 f1 的信息。
正確的做法
進(jìn)入到 node_modules\vue\dist\vue.runtime.esm.js,在 defineReactive 函數(shù)的 set 方法里添加斷點(diǎn),這里的 key 就是要監(jiān)聽的變量的名字。

在這里,就能夠看到 msg 發(fā)生變化的完整過程,快速定位到是 f2 導(dǎo)致的問題。
總結(jié)
通過查看調(diào)用棧的方式,不需要對項(xiàng)目有多熟悉,就能夠快速定位到數(shù)據(jù)發(fā)生錯(cuò)誤的地方。相比于用 console.log 或者花很多時(shí)間去理清代碼邏輯,數(shù)據(jù)流的方式,可以減少很多的工作量。
以上就是Vue 如何追蹤數(shù)據(jù)變化的詳細(xì)內(nèi)容,更多關(guān)于Vue 追蹤數(shù)據(jù)變化的資料請關(guān)注腳本之家其它相關(guān)文章!
- Vue2.0/3.0雙向數(shù)據(jù)綁定的實(shí)現(xiàn)原理詳解
- 關(guān)于vuex強(qiáng)刷數(shù)據(jù)丟失問題解析
- vue+canvas實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)從上到下刷新瀑布圖效果(類似QT的)
- vue 數(shù)據(jù)(data)賦值問題的解決方案
- Vue 重置data的數(shù)據(jù)為初始狀態(tài)操作
- Vue組件傳值過程中丟失數(shù)據(jù)的分析與解決方案
- SpringBoot+Vue實(shí)現(xiàn)數(shù)據(jù)添加功能
- 手寫Vue2.0 數(shù)據(jù)劫持的示例
- vue 數(shù)據(jù)雙向綁定的實(shí)現(xiàn)方法
- Vue中避免濫用this去讀取data中數(shù)據(jù)
- 用vue設(shè)計(jì)一個(gè)數(shù)據(jù)采集器
相關(guān)文章
使用Vue-Router 2實(shí)現(xiàn)路由功能實(shí)例詳解
vue-router 2只適用于Vue2.x版本,下面我們是基于vue2.0講的如何使用vue-router 2實(shí)現(xiàn)路由功能,需要的朋友可以參考下2017-11-11
animate.css在vue項(xiàng)目中的使用教程
在vue項(xiàng)目中使用動畫其實(shí)有多種方式,可以使用vue中的過渡transition,可以使用animate動畫與transition配合使用,也可以單獨(dú)使用animate動畫庫,下面我們開始介紹在vue中單獨(dú)使用animate動畫,感興趣的朋友一起看看吧2018-08-08
vue-cli基礎(chǔ)配置及webpack配置修改的完整步驟
這篇文章主要給大家介紹了關(guān)于vue-cli基礎(chǔ)配置及webpack配置修改的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用vue-cli具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue實(shí)現(xiàn)點(diǎn)擊后文字變色切換方法
下面小編就為大家分享一篇Vue實(shí)現(xiàn)點(diǎn)擊后文字變色切換方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
vue組件中節(jié)流函數(shù)的失效的原因和解決方法
這篇文章主要介紹了vue組件中節(jié)流函數(shù)的失效和解決方法,幫助大家更好的理解和學(xué)習(xí)vue框架,感興趣的朋友可以了解下2020-12-12

