Vue 如何追蹤數(shù)據(jù)變化
工作中時不時就會遇到這種情況:頁面上顯示的數(shù)據(jù)不對,需要前端同事進(jìn)行定位。
在一個使用 Vue 搭建的 SPA 應(yīng)用上,頁面最終展示的數(shù)據(jù),從初始化,到最后的展示,過程可能很簡單,也可能很復(fù)雜。遇到復(fù)雜的數(shù)據(jù)流,沒有合適的方法,排查起來會很頭疼。
如果能夠看到數(shù)據(jù)發(fā)生變化時的調(diào)用棧,就可以知道在錯誤的數(shù)據(jù)生成前,發(fā)生了什么,是哪一步的錯誤,導(dǎo)致了最終的錯誤。順著調(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ā)生了錯誤。
為什么 f2,f3 的調(diào)用信息會丟失?
因?yàn)?f1, f2, f3 都修改了 msg,在同一個微任務(wù)里觸發(fā)了 msg 的 Watcher,因?yàn)?f1 最先觸發(fā),所以f2,f3 的觸發(fā)無效。最終 Watcher 回調(diào)運(yùn)行的時候,只記得是 f1 觸發(fā)它的,所以此時的 Call Stack 只能看到 f1 的信息。
正確的做法進(jìn)入到 node_modulesvuedistvue.runtime.esm.js,在 defineReactive 函數(shù)的 set 方法里添加斷點(diǎn),這里的 key 就是要監(jiān)聽的變量的名字。
在這里,就能夠看到 msg 發(fā)生變化的完整過程,快速定位到是 f2 導(dǎo)致的問題。
總結(jié)通過查看調(diào)用棧的方式,不需要對項(xiàng)目有多熟悉,就能夠快速定位到數(shù)據(jù)發(fā)生錯誤的地方。相比于用 console.log 或者花很多時間去理清代碼邏輯,數(shù)據(jù)流的方式,可以減少很多的工作量。
以上就是Vue 如何追蹤數(shù)據(jù)變化的詳細(xì)內(nèi)容,更多關(guān)于Vue 追蹤數(shù)據(jù)變化的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. ASP實(shí)現(xiàn)加法驗(yàn)證碼2. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向3. 將properties文件的配置設(shè)置為整個Web應(yīng)用的全局變量實(shí)現(xiàn)方法4. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說明5. CSS hack用法案例詳解6. ASP.NET MVC遍歷驗(yàn)證ModelState的錯誤信息7. asp中response.write("中文")或者js中文亂碼問題8. PHP設(shè)計(jì)模式中工廠模式深入詳解9. jsp網(wǎng)頁實(shí)現(xiàn)貪吃蛇小游戲10. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)
