亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解vue3中watch監(jiān)聽的幾種情況

 更新時間:2025年03月28日 09:38:38   作者:藍色海島  
watch是CompositionAPI的一部分,用于監(jiān)聽響應式數(shù)據(jù)的變化并執(zhí)行相應的操作,本文主要介紹了詳解vue3中watch監(jiān)聽的幾種情況,具有一定的參考價值,感興趣的可以了解一下

一、監(jiān)聽ref創(chuàng)建的基本數(shù)據(jù)類型

watch的第一個參數(shù)直接寫需要監(jiān)聽的數(shù)據(jù)名即可,監(jiān)聽的是其值的變化
    <div>
      <h1>情況一:監(jiān)視【ref】定義的【基本類型】數(shù)據(jù)</h1>
      <h2>當前求和為:{{ sum }}</h2>
      <el-button @click="changeSum">點我sum+1</el-button>
    </div>
    
// 數(shù)據(jù)
let sum = ref(0)
// 方法
function changeSum() {
  sum.value += 1
}
// 監(jiān)視,情況一:監(jiān)視【ref】定義的【基本類型】數(shù)據(jù)
const stopWatch = watch(sum, (newValue, oldValue) => {
  console.log('sum變化了', newValue, oldValue)
  if (newValue >= 10) {
    stopWatch()
  }
})

二、監(jiān)聽ref創(chuàng)建的對象類型

watch監(jiān)聽person時,監(jiān)聽的是person的地址值,只有當person的引用地址發(fā)生變化時才能監(jiān)聽得到,當寫成Object.assign(person.value, { name: '李四', age: 90, son: { age: 5 } })時依然監(jiān)聽不到
當開啟deep: true時,無論修改person中的哪個參數(shù),包括son對象,都能監(jiān)聽得到

   <div>
      <h1>情況二:監(jiān)視【ref】定義的【對象類型】數(shù)據(jù)</h1>
      <h2>姓名:{{ person.name }}</h2>
      <h2>年齡:{{ person.age }}</h2>
      <h2>兒子年齡:{{ person.son.age }}</h2>
      <el-button @click="changeName">修改名字</el-button>
      <el-button @click="changeAge">修改年齡</el-button>
      <el-button @click="changePerson">修改整個人</el-button>
      <el-button @click="changeSonAge">修改兒子年齡</el-button>
    </div>
    
// 數(shù)據(jù)
let person = ref({
  name: '張三',
  age: 18,
  son: { age: 5 }
})
// 方法
function changeName() {
  person.value.name += '~'
}
function changeAge() {
  person.value.age += 1
}
function changePerson() {
  person.value = { name: '李四', age: 90, son: { age: 5 } }
}
function changeSonAge() {
  person.value.son.age += 1
}
watch(
  person,
  (newValue, oldValue) => {
    console.log('person變化了', newValue, oldValue)
  },
  { deep: true }
)

三、監(jiān)聽reactive定義的對象類型數(shù)據(jù),會默認開啟深度監(jiān)聽

前面提到,如果是監(jiān)聽ref創(chuàng)建的對象類型數(shù)據(jù),需要手動開啟深度監(jiān)聽,而監(jiān)聽reactive創(chuàng)建的對象類型數(shù)據(jù)時,會自動開啟深度監(jiān)聽

  <div>
      <h1>情況三:監(jiān)視【reactive】定義的【對象類型】數(shù)據(jù)</h1>
      <h2>姓名:{{ person.name }}</h2>
      <h2>年齡:{{ person.age }}</h2>
      <el-button @click="changeName">修改名字</el-button>
      <el-button @click="changeAge">修改年齡</el-button>
      <el-button @click="changePerson">修改整個人</el-button>
      <hr />
      <h2>測試:{{ obj.a.b.c }}</h2>
      <el-button @click="test">修改obj.a.b.c</el-button>
    </div>
    
// 數(shù)據(jù)
let person = reactive({ name: '張三', age: 18 })
let obj = reactive({ a: { b: { c: 666 } } })
// 方法
function changeName() {
  person.name += '~'
}
function changeAge() {
  person.age += 1
}
function changePerson() {
  Object.assign(person, { name: '李四', age: 80 })
}
function test() {
  obj.a.b.c += 888
}

// 監(jiān)視,情況三:監(jiān)視【reactive】定義的【對象類型】數(shù)據(jù),且默認是開啟深度監(jiān)視的
watch(person, (newValue, oldValue) => {
  console.log('person變化了', newValue, oldValue)
})
watch(obj, (newValue, oldValue) => {
  console.log('Obj變化了', newValue, oldValue)
})

四、監(jiān)聽ref或reactive定義的對象類型中的某個屬性

監(jiān)聽的是對象的基本類型數(shù)據(jù),要寫成函數(shù)形式
監(jiān)聽的是對象的對象類型數(shù)據(jù),可以寫成函數(shù)形式,也可以直接寫
監(jiān)聽的是對象的對象類型數(shù)據(jù),并且改變對象時改變了應用地址,例如person.car = { ... },就必須要寫成函數(shù)形式

 <div>
      <h1>情況四:監(jiān)視【ref】或【reactive】定義的【對象類型】數(shù)據(jù)中的某個屬性</h1>
      <h2>姓名:{{ person.name }}</h2>
      <h2>年齡:{{ person.age }}</h2>
      <h2>汽車:{{ person.car.c1 }}、{{ person.car.c2 }}</h2>
      <el-button @click="changeName">修改名字</el-button>
      <el-button @click="changeAge">修改年齡</el-button>
      <el-button @click="changeC1">修改第一臺車</el-button>
      <el-button @click="changeC2">修改第二臺車</el-button>
      <el-button @click="changeCar">修改整個車</el-button>
    </div>
    
// 數(shù)據(jù)
let person = reactive({ name: '張三', age: 18, car: { c1: '奔馳', c2: '寶馬' } })
// 方法
function changeName() {
  person.name += '~'
}
function changeAge() {
  person.age += 1
}
function changeC1() {
  person.car.c1 = '奧迪'
}
function changeC2() {
  person.car.c2 = '大眾'
}
function changeCar() {
  // person.car = { c1: '雅迪', c2: '愛瑪' }
  Object.assign(person.car, { c1: '雅迪', c2: '愛瑪' })
}
// 監(jiān)視,情況四:監(jiān)視響應式對象中的某個屬性,且該屬性是基本類型的,要寫成函數(shù)式
watch(
  () => person.name,
  (newValue, oldValue) => {
    console.log('person.name變化了', newValue, oldValue)
  }
)
watch(
  () => person.car, // 如果使用 person.car = { ... } 必須要使用函數(shù)寫法;如果使用Object.assign,可以直接寫person.car
  (newValue, oldValue) => {
    console.log('person.car變化了', newValue, oldValue)
  },
  { deep: true }
)

如果需要監(jiān)聽多個數(shù)據(jù),可以將2個watch合并為一個:

watch(
  [() => person.name, () => person.car],
  (newValue, oldValue) => {
    console.log('person.car變化了', newValue, oldValue)
  },
  { deep: true }
)

總結:

監(jiān)聽ref創(chuàng)建的基本數(shù)據(jù)類型,必須直接寫,不可以寫成函數(shù)形式
監(jiān)聽ref創(chuàng)建的對象數(shù)據(jù)類型,可以直接寫,也可以寫成函數(shù)形式,需要開啟deep: true
監(jiān)聽reactive創(chuàng)建的對象數(shù)據(jù)類型,必須直接寫,不可以寫成函數(shù)形式,默認開啟了deep: true
監(jiān)聽ref或reactive創(chuàng)建的對象類型中的某個屬性,該類型為基本數(shù)據(jù)類型,必須寫成函數(shù)形式
監(jiān)聽ref或reactive創(chuàng)建的對象類型中的某個屬性,該類型為對象數(shù)據(jù)類型,可以直接寫,也可以寫成函數(shù)形式,需要開啟deep: true。如果想要監(jiān)聽引用地址變化,必須寫成函數(shù)形式

序號情況是否使用函數(shù)寫法是否需要手動開啟深度監(jiān)聽
1監(jiān)聽ref創(chuàng)建的基本數(shù)據(jù)類型否。必須直接寫,不可以寫成函數(shù)形式
2監(jiān)聽ref創(chuàng)建的對象數(shù)據(jù)類型皆可??梢灾苯訉懀部梢詫懗珊瘮?shù)形式
3監(jiān)聽reactive創(chuàng)建的對象數(shù)據(jù)類型否。必須直接寫,不可以寫成函數(shù)形式否。默認開啟了深度監(jiān)聽
4監(jiān)聽ref或reactive創(chuàng)建的對象類型中的某個屬性,該類型為基本數(shù)據(jù)類型是。必須寫成函數(shù)形式
5監(jiān)聽ref或reactive創(chuàng)建的對象類型中的某個屬性,該類型為對象數(shù)據(jù)類型皆可。可以直接寫,也可以寫成函數(shù)形式;如果想要監(jiān)聽引用地址變化,必須寫成函數(shù)形式

到此這篇關于詳解vue3中watch監(jiān)聽的幾種情況的文章就介紹到這了,更多相關vue3 watch監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • VUE中攔截請求并無感知刷新token方式

    VUE中攔截請求并無感知刷新token方式

    這篇文章主要介紹了VUE中攔截請求并無感知刷新token方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vite基本常見的配置講解

    vite基本常見的配置講解

    這篇文章主要給大家介紹了關于vite基本常見配置講解的相關資料,最近做項目要求將webpack打包方式換成vite,下面將詳細講解一下配置vite需要改動的東西,需要的朋友可以參考下
    2023-11-11
  • vue項目使用.env文件配置全局環(huán)境變量的方法

    vue項目使用.env文件配置全局環(huán)境變量的方法

    這篇文章主要介紹了vue項目使用.env文件配置全局環(huán)境變量的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Vue與Node.js通過socket.io通信的示例代碼

    Vue與Node.js通過socket.io通信的示例代碼

    這篇文章主要介紹了Vue與Node.js通過socket.io通信的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 解決vue-router 切換tab標簽關閉時緩存問題

    解決vue-router 切換tab標簽關閉時緩存問題

    這篇文章主要介紹了解決vue-router 切換tab標簽關閉時緩存問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue自定義指令實現(xiàn)checkbox全選功能的方法

    Vue自定義指令實現(xiàn)checkbox全選功能的方法

    下面小編就為大家分享一篇Vue自定義指令實現(xiàn)checkbox全選功能的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Element修改彈窗類組件的層級的實現(xiàn)

    Element修改彈窗類組件的層級的實現(xiàn)

    本文主要介紹了Element修改彈窗類組件的層級的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 壓縮Vue.js打包后的體積方法總結(Vue.js打包后體積過大問題)

    壓縮Vue.js打包后的體積方法總結(Vue.js打包后體積過大問題)

    大家都知道,Vuejs的 CLI工具 是基于 webpack 來實現(xiàn)的,所以在項目打包后,會生成的文件會很大。 主要原因是 webpack 將我們所有文件都打包成一個js文件,即使再小的項目,打包之后文件都會變得很大。 下面講講最近我遇到的相同問題。
    2020-02-02
  • vue+echarts繪制省份地圖并添加自定義標注方式

    vue+echarts繪制省份地圖并添加自定義標注方式

    這篇文章主要介紹了vue+echarts繪制省份地圖并添加自定義標注方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue中引入swiper報錯的問題及解決

    Vue中引入swiper報錯的問題及解決

    這篇文章主要介紹了Vue中引入swiper報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論