解決vue watch數(shù)據(jù)的方法被調(diào)用了兩次的問題
背景:
路由結(jié)構(gòu)/video/1.mp4,即/video是父路由,/1.mp4是/video的動態(tài)子路由,在/video父路由中會通過url的params獲取視頻信息,即通過/1.mp4獲取對應(yīng)的視頻完整信息,然后通過props傳到動態(tài)子路由中,然后子路由通過接受到的視頻對象,進(jìn)行展示
問題:
當(dāng)路由切換時,即當(dāng)我點(diǎn)擊其他視頻時,導(dǎo)致動態(tài)子路由變化時,我監(jiān)聽了/video父路由的變化并重新根據(jù)url的params獲取視頻對象,并自動通過props傳入子路由中,我在子路由中通過watch 視頻對象來進(jìn)行一些操作,結(jié)果
watch: { video () { console.log('test') }}
test被打印了兩次,通過一番查找,才發(fā)現(xiàn),當(dāng)子路由切換時,父路由/video中的data數(shù)據(jù)都會被初始化為默認(rèn)值,所以導(dǎo)致video對象變化了兩次,一次是因?yàn)槌跏蓟恢刂脼槟J(rèn)值空對象,一次是請求后的正確數(shù)據(jù)
結(jié)局:
將video對象存到vuex中,然后父路由將vuex中的video對象傳給子路由就行了
補(bǔ)充知識:vue watch一個對象或數(shù)組時,newvalue和oldvalue一樣
在官方的代碼改寫了一下,當(dāng)深度watch一個對象時,newval和oldval的值為什么是相等的呢?
var vm = new Vue({ data: { a: 1, c:{ c1:1, c2:2 } }, watch: { ’a’: function (val, oldVal) { console.log(val, oldVal,(val== oldVal)) }, // 方法名 ’b’: ’someMethod’, // 深度 watcher ’c’: { handler: function (val, oldVal) { console.log(val, oldVal,(val== oldVal)) }, deep: true } }}) vm.a = 2 vm.c.c1 = 2
和深度無關(guān),而是在修改(不是替換)對象或數(shù)組時,舊值將與新值相同,因?yàn)樗鼈兯饕粋€對象/數(shù)組。Vue 不會保留修改之前值的副本。
以上這篇解決vue watch數(shù)據(jù)的方法被調(diào)用了兩次的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. PHP laravel實(shí)現(xiàn)導(dǎo)出PDF功能2. JavaScript實(shí)現(xiàn)留言板實(shí)戰(zhàn)案例3. 使用Blazor框架實(shí)現(xiàn)在前端瀏覽器中導(dǎo)入和導(dǎo)出Excel4. ASP基礎(chǔ)知識Command對象講解5. python中文本字符處理的簡單方法記錄6. 資深程序員:給Python軟件開發(fā)測試的25個忠告!7. Python-openpyxl表格讀取寫入的案例詳解8. 如何從Python的cmd中獲得.py文件參數(shù)9. Python基于requests庫爬取網(wǎng)站信息10. vscode運(yùn)行php報(bào)錯php?not?found解決辦法

網(wǎng)公網(wǎng)安備