最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

二、監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象類(lèi)型

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

   <div>
      <h1>情況二:監(jiān)視【ref】定義的【對(duì)象類(lèi)型】數(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">修改整個(gè)人</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)聽(tīng)reactive定義的對(duì)象類(lèi)型數(shù)據(jù),會(huì)默認(rèn)開(kāi)啟深度監(jiān)聽(tīng)

前面提到,如果是監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象類(lèi)型數(shù)據(jù),需要手動(dòng)開(kāi)啟深度監(jiān)聽(tīng),而監(jiān)聽(tīng)reactive創(chuàng)建的對(duì)象類(lèi)型數(shù)據(jù)時(shí),會(huì)自動(dòng)開(kāi)啟深度監(jiān)聽(tīng)

  <div>
      <h1>情況三:監(jiān)視【reactive】定義的【對(duì)象類(lèi)型】數(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">修改整個(gè)人</el-button>
      <hr />
      <h2>測(cè)試:{{ 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】定義的【對(duì)象類(lèi)型】數(shù)據(jù),且默認(rèn)是開(kāi)啟深度監(jiān)視的
watch(person, (newValue, oldValue) => {
  console.log('person變化了', newValue, oldValue)
})
watch(obj, (newValue, oldValue) => {
  console.log('Obj變化了', newValue, oldValue)
})

四、監(jiān)聽(tīng)ref或reactive定義的對(duì)象類(lèi)型中的某個(gè)屬性

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

 <div>
      <h1>情況四:監(jiān)視【ref】或【reactive】定義的【對(duì)象類(lèi)型】數(shù)據(jù)中的某個(gè)屬性</h1>
      <h2>姓名:{{ person.name }}</h2>
      <h2>年齡:{{ person.age }}</h2>
      <h2>汽車(chē):{{ person.car.c1 }}、{{ person.car.c2 }}</h2>
      <el-button @click="changeName">修改名字</el-button>
      <el-button @click="changeAge">修改年齡</el-button>
      <el-button @click="changeC1">修改第一臺(tái)車(chē)</el-button>
      <el-button @click="changeC2">修改第二臺(tái)車(chē)</el-button>
      <el-button @click="changeCar">修改整個(gè)車(chē)</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: '愛(ài)瑪' }
  Object.assign(person.car, { c1: '雅迪', c2: '愛(ài)瑪' })
}
// 監(jiān)視,情況四:監(jiān)視響應(yīng)式對(duì)象中的某個(gè)屬性,且該屬性是基本類(lèi)型的,要寫(xiě)成函數(shù)式
watch(
  () => person.name,
  (newValue, oldValue) => {
    console.log('person.name變化了', newValue, oldValue)
  }
)
watch(
  () => person.car, // 如果使用 person.car = { ... } 必須要使用函數(shù)寫(xiě)法;如果使用Object.assign,可以直接寫(xiě)person.car
  (newValue, oldValue) => {
    console.log('person.car變化了', newValue, oldValue)
  },
  { deep: true }
)

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

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

總結(jié):

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

序號(hào)情況是否使用函數(shù)寫(xiě)法是否需要手動(dòng)開(kāi)啟深度監(jiān)聽(tīng)
1監(jiān)聽(tīng)ref創(chuàng)建的基本數(shù)據(jù)類(lèi)型否。必須直接寫(xiě),不可以寫(xiě)成函數(shù)形式
2監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象數(shù)據(jù)類(lèi)型皆可??梢灾苯訉?xiě),也可以寫(xiě)成函數(shù)形式
3監(jiān)聽(tīng)reactive創(chuàng)建的對(duì)象數(shù)據(jù)類(lèi)型否。必須直接寫(xiě),不可以寫(xiě)成函數(shù)形式否。默認(rèn)開(kāi)啟了深度監(jiān)聽(tīng)
4監(jiān)聽(tīng)ref或reactive創(chuàng)建的對(duì)象類(lèi)型中的某個(gè)屬性,該類(lèi)型為基本數(shù)據(jù)類(lèi)型是。必須寫(xiě)成函數(shù)形式
5監(jiān)聽(tīng)ref或reactive創(chuàng)建的對(duì)象類(lèi)型中的某個(gè)屬性,該類(lèi)型為對(duì)象數(shù)據(jù)類(lèi)型皆可??梢灾苯訉?xiě),也可以寫(xiě)成函數(shù)形式;如果想要監(jiān)聽(tīng)引用地址變化,必須寫(xiě)成函數(shù)形式

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

相關(guān)文章

  • vue3使用localStorage實(shí)現(xiàn)登錄注冊(cè)功能實(shí)例

    vue3使用localStorage實(shí)現(xiàn)登錄注冊(cè)功能實(shí)例

    這篇文章主要給大家介紹了關(guān)于vue3使用localStorage實(shí)現(xiàn)登錄注冊(cè)功能的相關(guān)資料, localStorage這個(gè)特性主要是用來(lái)作為本地存儲(chǔ)來(lái)使用的,解決了cookie存儲(chǔ)空間不足的問(wèn)題,需要的朋友可以參考下
    2023-06-06
  • vue項(xiàng)目實(shí)現(xiàn)減少app.js和vender.js的體積操作

    vue項(xiàng)目實(shí)現(xiàn)減少app.js和vender.js的體積操作

    這篇文章主要介紹了vue項(xiàng)目實(shí)現(xiàn)減少app.js和vender.js的體積操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Vue.js 實(shí)現(xiàn)微信公眾號(hào)菜單編輯器功能(一)

    Vue.js 實(shí)現(xiàn)微信公眾號(hào)菜單編輯器功能(一)

    最近vue.js 非?;馃?,小編也趁機(jī)學(xué)習(xí)了下vuejs的一些基礎(chǔ)知識(shí),于是嘗試做一個(gè)像微信平臺(tái)里的菜單編輯器功能,下面腳本之家小編把vue.js 微信公眾號(hào)菜單編輯器功能的實(shí)現(xiàn)代碼分享給大家,需要的朋友參考下
    2018-05-05
  • vue3實(shí)現(xiàn)自定義導(dǎo)航菜單的示例代碼

    vue3實(shí)現(xiàn)自定義導(dǎo)航菜單的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用vue3實(shí)現(xiàn)自定義導(dǎo)航菜單,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • VUE設(shè)置和清除定時(shí)器的方式及遇到的問(wèn)題

    VUE設(shè)置和清除定時(shí)器的方式及遇到的問(wèn)題

    ?最近需要再頁(yè)面里做個(gè)倒計(jì)時(shí),發(fā)現(xiàn)用clearInterval()清除定時(shí)器失效,下面這篇文章主要給大家介紹了關(guān)于VUE設(shè)置和清除定時(shí)器的方式及遇到的問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • vue3封裝一個(gè)帶動(dòng)畫(huà)的關(guān)閉按鈕示例詳解

    vue3封裝一個(gè)帶動(dòng)畫(huà)的關(guān)閉按鈕示例詳解

    這篇文章主要為大家介紹了vue3封裝一個(gè)帶動(dòng)畫(huà)的關(guān)閉按鈕示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Vue使用element-ui實(shí)現(xiàn)菜單導(dǎo)航

    Vue使用element-ui實(shí)現(xiàn)菜單導(dǎo)航

    這篇文章主要為大家詳細(xì)介紹了Vue使用element-ui實(shí)現(xiàn)菜單導(dǎo)航,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • el-table如何添加loading效果

    el-table如何添加loading效果

    這篇文章主要介紹了el-table如何添加loading效果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Vue手機(jī)號(hào)正則匹配姓名加密展示功能的實(shí)現(xiàn)

    Vue手機(jī)號(hào)正則匹配姓名加密展示功能的實(shí)現(xiàn)

    這篇文章主要介紹了Vue手機(jī)號(hào)正則匹配,姓名加密展示,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 在pycharm中開(kāi)發(fā)vue的方法步驟

    在pycharm中開(kāi)發(fā)vue的方法步驟

    這篇文章主要介紹了在pycharm中開(kāi)發(fā)vue的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評(píng)論

仁化县| 平泉县| 辰溪县| 驻马店市| 宝山区| 自治县| 隆尧县| 北宁市| 泰顺县| 化州市| 巴彦淖尔市| 桦甸市| 方正县| 鄱阳县| 蓝田县| 托克逊县| 永康市| 沅江市| 缙云县| 门头沟区| 平安县| 左贡县| 景德镇市| 崇仁县| 许昌县| 五台县| 错那县| 无为县| 榆树市| 枣阳市| 乌恰县| 红原县| 元氏县| 湘乡市| 伊宁县| 涟源市| 台东市| 新乡县| 太白县| 邢台市| 江都市|