亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、需求分析,問題描述

1、需求

監聽數組或對象,修改其屬性數據,但watch并沒有監聽到變化,尋找原因和解決方式。

2、問題

  • 怎樣正確使用watch監聽對象和數組?
  • 怎樣停止watch監聽?

二、解決問題,答案速覽

1、Watch監聽器-監聽Ref

(1)監聽單個ref對象

對于單個ref對象的監聽,我們只需要直接監聽即可,沒有套路。

<script setup>
import { reactive, ref, watch, computed } from 'vue';
// 定義數據
let nameRef = ref('大澈')
// 點擊事件-修改數據的值
const handleChange = () => {
  nameRef.value = '程序員大澈'
}
// 監聽數據變化
watch(nameRef, (newValue, oldValue) => {
  console.log(`新的值是:${newValue},舊的值是:${oldValue}`);
})
</script>

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

(2)監聽單個ref對象的值-基本類型值

對于單個ref對象的基本類型值的監聽,我們需要借助getter函數監聽。直接監聽會報警告,并且監聽不到變化。

<script setup>
import { reactive, ref, watch, computed } from 'vue';
// 定義數據
let nameRef = ref('大澈')
// 點擊事件-修改數據的值
const handleChange = () => {
  nameRef.value = '程序員大澈'
}
// 監聽數據變化
watch(() => nameRef.value, (newValue, oldValue) => {
  console.log(`新的值是:${newValue},舊的值是:${oldValue}`);
})
</script>

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

(3)監聽單個ref對象的值-復雜類型值

內部自動將值轉為reactive對象,監聽reactive對象的詳細見下文。

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

(4)監聽多個ref對象或其值

對于多個ref對象或其值的監聽,我們需要使用數組將watch監聽器的目標包裹。

<script setup>
import { reactive, ref, watch, computed } from 'vue';
// 定義數據
let nameRef111 = ref('大澈111')
let nameRef222 = ref('大澈222')
// 點擊事件-修改數據的值
const handleChange = () => {
  nameRef111.value = '程序員大澈111'
  nameRef222.value = '程序員大澈222'
}
// 監聽數據變化
watch([nameRef111, () => nameRef222.value], (newValue, oldValue) => {
  console.log(`新的值是:${newValue[0]},舊的值是:${oldValue[0]}`);
})
</script>

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

2、Watch監聽器-監聽Reactive

(1)監聽單個reactive對象-對象類型值

對于單個reactive對象的對象類型值的監聽,我們只需要直接監聽即可,沒有套路。

但此時我們會發現,watch的新值和舊值是相同的,為什么會這樣呢?又怎么解決呢?

因為對于引用類型數據,賦值存的是地址,地址指向的是堆,所以無論值怎么改變,新舊對象都指向同一個地址。

至于解決的辦法很簡單, 我們不去直接監聽一個引用類型,而是去監聽引用類型中一個具體的值即可。

<script setup>
import { reactive, ref, watch, computed } from 'vue';
// 定義數據
let dataReactive = reactive({
  name: '大澈',
})
// 點擊事件-修改數據的值
const handleChange = () => {
  dataReactive.name = '程序員大澈'
}
// 監聽數據變化
watch(dataReactive, (newValue, oldValue) => {
  console.log(`新的值是:${newValue.name},舊的值是:${oldValue.name}`);
})
</script>

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

(2)監聽單個reactive對象-對象類型值-基本類型屬性

對于單個reactive對象的對象類型值的基本類型屬性的監聽,我們需要借助getter函數監聽。直接監聽會報警告,并且監聽不到變化。

值得注意的是,watch的新值和舊值是不同的了。

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

(3)監聽單個reactive對象-對象類型值-對象類型屬性

對于單個reactive對象的對象類型值的對象類型屬性的監聽,我們需要借助getter函數監聽。直接監聽會報警告,并且監聽不到變化。

如果是監聽整個對象類型屬性,只有進行整個對象替換時,才不需要開啟deep深度監聽。其它時候,如修改、刪除、新增,都需要開啟deep深度監聽,才能監聽數據的變化。

如果是監聽對象類型屬性中的某個屬性值,則不需要開啟deep深度監聽。

<script setup>
import { reactive, ref, watch, computed } from 'vue';
// 定義數據
let dataReactive = reactive({
  obj: {
    age: 18,
  },
})
// 點擊事件-修改數據的值
const handleChange = () => {
  dataReactive.obj.age = 99
}
// 監聽數據變化
watch(() => dataReactive.obj, (newValue, oldValue) => {
  console.log(`新的值是:${newValue.age},舊的值是:${oldValue.age}`);
}, {
  deep: true,
})
</script>

Vue3問題:如何解決Watch監聽對象數組失效,及如何停止監聽?

(4)監聽單個reactive對象-對象類型值-數組類型屬性

同監聽單個reactive對象-對象類型值-對象類型屬性。

(5)監聽單個reactive對象-數組類型值

所有情況都同監聽單個reactive對象-對象類型值。

(6)監聽多個reactive對象值或其屬性值

同監聽多個ref對象或其值。

三、問題解析,知識總結

1、怎樣正確使用watch監聽對象和數組?

內容如上。

2、怎樣停止watch監聽?

有的時候,我們可能只需要監聽一次。在監聽之后,我們就需要取消對watch的監聽。此時我們可以這樣做,將watch監聽器賦值給一個變量,在取消監聽的時候調用此變量即可。

<script setup>
import { reactive, ref, watch, computed } from 'vue';
// 定義數據
let nameRef = ref('大澈')
// 點擊事件-修改數據的值
const handleChange = () => {
  nameRef.value = '程序員大澈'
}
// 點擊事件-停止對應的watch監聽數據
const handleStopChange = () => {
  stopWatch()
}
// 監聽數據變化
const stopWatch = watch(() => nameRef.value, (newValue, oldValue) => {
  console.log(`新的值是:${newValue},舊的值是:${oldValue}`);
})
</script>

分享到:
標簽:Vue
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定