溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue3中的watch怎么使用

發(fā)布時(shí)間:2023-04-07 16:30:12 來源:億速云 閱讀:107 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Vue3中的watch怎么使用”,在日常操作中,相信很多人在Vue3中的watch怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Vue3中的watch怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

     watch函數(shù)用于偵聽某個(gè)值的變化,當(dāng)該值發(fā)生改變后,觸發(fā)對應(yīng)的處理邏輯。

    一、watch的基本實(shí)例

    <template>
      <div>
        <div>{{ count }}</div>
        <button @click="changCount">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import {ref,reactive, watch} from 'vue'
    const count = ref(0)
    function changCount(){
      count.value++
    }
    watch(count,(newValue,oldValue)=>{
      if(newValue){
        console.log(`我偵聽到了count狀態(tài)的變化,當(dāng)前值為${newValue},從而處理相關(guān)邏輯`);
      }
    })
    </script>
     
    <style>
     
    </style>

    二、watch監(jiān)聽多個(gè)數(shù)據(jù)

    getter 函數(shù):

    <template>
      <div>
        <div>{{ x }}</div>
        <button @click="changCount">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch } from "vue";
    const x = ref(1);
    const y = ref(5);
    function changCount() {
      x.value++;
    }
    watch(
      () => x.value + y.value,
      (sum) => {
        console.log(`我是x與y之和${sum}`);
      }
    );
    </script>
     
    <style>
    </style>

    多個(gè)來源組成的數(shù)組

    <template>
      <div>
        <div>{{ x }}</div>
        <button @click="changCount">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch } from "vue";
    const x = ref(1);
    const y = ref(5);
    function changCount() {
      x.value++;
    }
    watch(
      [x,y],
      ([x,y]) => {
        console.log(`我是x=>${x},我是y=》${y}`);
      }
    );
    </script>
     
    <style>
    </style>

    三、watch監(jiān)聽對象的值

    <template>
      <div>
        <div>{{ obj.name }}</div>
        <button @click="changObj">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch } from "vue";
    const obj = ref({name:'你好'})
    function changObj(){
      obj.value.name+='我不好'
    }
    watch(()=>obj.value.name,(name)=>{
      console.log(name);
    })
    </script>
     
    <style>
    </style>

    四、watch監(jiān)聽器的配置參數(shù)

    1.deep

    用于開啟深度監(jiān)聽

    <template>
      <div>
        <div>{{ obj.name }}</div>
        <button @click="changObj">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch, watchEffect } from "vue";
    const obj = ref({name:'你好'})
    function changObj(){
      obj.value.name+='我不好'
    }
    // obj是一個(gè)RefImpl對象,當(dāng)不開啟深度監(jiān)聽的時(shí)候,監(jiān)聽obj無法檢測到obj屬性的變化
    watch(obj,()=>{
      console.log(obj.value.name);
    }, { deep: true })
    </script>
     
    <style>
    </style>

    2.immediate

    是否開啟初始化檢測,默認(rèn)是值發(fā)生變化時(shí),才會執(zhí)行監(jiān)聽器里面的方法,開啟immediate后初始化就執(zhí)行一次。

    <template>
      <div>
        <div>{{ obj.name }}</div>
        <button @click="changObj">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch, watchEffect } from "vue";
    const obj = ref({name:'你好'})
    function changObj(){
      obj.value.name+='我不好'
    }
    // obj是一個(gè)RefImpl對象,當(dāng)不開啟深度監(jiān)聽的時(shí)候,監(jiān)聽obj無法檢測到obj屬性的變化
    watch(obj,()=>{
      console.log(obj.value.name);
    }, { deep: true,immediate:true })
    </script>
     
    <style>
    </style>

    五、通過watchEffect()簡化watch

    偵聽器的回調(diào)使用與源完全相同的響應(yīng)式狀態(tài)是很常見的。例如:

    <template>
      <div>
        <div>{{ obj.name }}</div>
        <button @click="changObj">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch, watchEffect } from "vue";
    const obj = ref({name:'你好'})
    function changObj(){
      obj.value.name+='我不好'
    }
    watch(obj.value,()=>{
      console.log(obj.value.name);
    })
    </script>
     
    <style>
    </style>

    我們可以使用watchEffect 函數(shù)來簡化上面的代碼。watchEffect() 允許我們自動跟蹤回調(diào)的響應(yīng)式依賴。上面的偵聽器可以重寫為:

    <template>
      <div>
        <div>{{ obj.name }}</div>
        <button @click="changObj">更改count的值</button>
      </div>
    </template>
     
    <script setup>
    import { ref, reactive, watch, watchEffect } from "vue";
    const obj = ref({name:'你好'})
    function changObj(){
      obj.value.name+='我不好'
    }
    // watch(obj.value,()=>{
    //   console.log(obj.value.name);
    // })
    watchEffect(()=>{
      console.log(obj.value.name);
    })
    </script>
     
    <style>
    </style>

    注:需要注意的是watchEffect 回調(diào)會立即執(zhí)行,不需要指定immediate

    六、watch vs. watchEffect

    watch 和 watchEffect 都能響應(yīng)式地執(zhí)行有副作用的回調(diào)。它們之間的主要區(qū)別是追蹤響應(yīng)式依賴的方式:

    • watch 只追蹤明確偵聽的數(shù)據(jù)源。它不會追蹤任何在回調(diào)中訪問到的東西。另外,僅在數(shù)據(jù)源確實(shí)改變時(shí)才會觸發(fā)回調(diào)。watch 會避免在發(fā)生副作用時(shí)追蹤依賴,因此,我們能更加精確地控制回調(diào)函數(shù)的觸發(fā)時(shí)機(jī)。

    • watchEffect,則會在副作用發(fā)生期間追蹤依賴。它會在同步執(zhí)行過程中,自動追蹤所有能訪問到的響應(yīng)式屬性。這更方便,而且代碼往往更簡潔,但有時(shí)其響應(yīng)性依賴關(guān)系會不那么明確。

    七、回調(diào)觸發(fā)機(jī)制與停止監(jiān)聽器

    如果想在偵聽器回調(diào)中能訪問被 Vue 更新之后的 DOM,你需要指明 flush: 'post' 選項(xiàng):

    watch(source, callback, {
      flush: 'post'
    })
     
    watchEffect(callback, {
      flush: 'post'
    })

    停止監(jiān)聽

    在 setup() 或 <script setup> 中用同步語句創(chuàng)建的偵聽器,會自動綁定到宿主組件實(shí)例上,并且會在宿主組件卸載時(shí)自動停止。因此,在大多數(shù)情況下,你無需關(guān)心怎么停止一個(gè)偵聽器。

    一個(gè)關(guān)鍵點(diǎn)是,偵聽器必須用同步語句創(chuàng)建:如果用異步回調(diào)創(chuàng)建一個(gè)偵聽器,那么它不會綁定到當(dāng)前組件上,你必須手動停止它,以防內(nèi)存泄漏。如下方這個(gè)例子:

    // ...當(dāng)該偵聽器不再需要時(shí)
    unwatch()

    到此,關(guān)于“Vue3中的watch怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI