解決vue watch數(shù)據(jù)的方法被調用了兩次的問題
背景:
路由結構/video/1.mp4,即/video是父路由,/1.mp4是/video的動態(tài)子路由,在/video父路由中會通過url的params獲取視頻信息,即通過/1.mp4獲取對應的視頻完整信息,然后通過props傳到動態(tài)子路由中,然后子路由通過接受到的視頻對象,進行展示
問題:
當路由切換時,即當我點擊其他視頻時,導致動態(tài)子路由變化時,我監(jiān)聽了/video父路由的變化并重新根據(jù)url的params獲取視頻對象,并自動通過props傳入子路由中,我在子路由中通過watch 視頻對象來進行一些操作,結果
watch: {
video () {
console.log("test")
}
}
test被打印了兩次,通過一番查找,才發(fā)現(xiàn),當子路由切換時,父路由/video中的data數(shù)據(jù)都會被初始化為默認值,所以導致video對象變化了兩次,一次是因為初始化被重置為默認值空對象,一次是請求后的正確數(shù)據(jù)
結局:
將video對象存到vuex中,然后父路由將vuex中的video對象傳給子路由就行了
補充知識:vue watch一個對象或數(shù)組時,newvalue和oldvalue一樣
在官方的代碼改寫了一下,當深度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
和深度無關,而是在修改(不是替換)對象或數(shù)組時,舊值將與新值相同,因為它們索引同一個對象/數(shù)組。Vue 不會保留修改之前值的副本。
以上這篇解決vue watch數(shù)據(jù)的方法被調用了兩次的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解如何在Vue3使用<script lang=“ts“ setup>語法糖
本文主要介紹了在Vue3使用<script lang=“ts“ setup>語法糖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
使用vue根據(jù)狀態(tài)添加列表數(shù)據(jù)和刪除列表數(shù)據(jù)的實例
今天小編就為大家分享一篇使用vue根據(jù)狀態(tài)添加列表數(shù)據(jù)和刪除列表數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示)
這篇文章主要介紹了vue封裝自定義指令之動態(tài)顯示title操作(溢出顯示,不溢出不顯示),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
vue+element項目實時監(jiān)聽div寬度的變化
這篇文章主要介紹了vue+element項目里實時監(jiān)聽某個div寬度的變化,然后執(zhí)行相應的事件,本文結合示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-08-08

