欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3下watch的使用方法示例

 更新時間:2023年03月18日 11:33:53   作者:笑道三千  
vue3中的watch是一個組合式的API使用時需要引入,下面這篇文章主要給大家介紹了關于vue3下watch使用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

既然是數(shù)據(jù)監(jiān)聽,監(jiān)聽的是它的變化。那么就需要能夠捕獲它的變更,于是監(jiān)聽的數(shù)據(jù)必然要是響應式數(shù)據(jù)

watch(WatcherSource, Callback, [WatchOptions])
參數(shù):
WatcherSource:想要監(jiān)聽的響應式數(shù)據(jù)。
Callback:執(zhí)行的回調(diào)函數(shù),入?yún)ⅲ╪ewValue,oldValue)。
[WatchOptions]:deep、immediate、flush可選。

對于WatchOptions的參數(shù)配置:

deep:當需要對對象等引用類型數(shù)據(jù)進行深度監(jiān)聽時,設置deep: true,默認值是false。
immediate:默認情況下watch是惰性的,設置immediate: true時,watch會在初始化時立即執(zhí)行回調(diào)函數(shù)一次。
flush:控制回調(diào)函數(shù)的執(zhí)行時機,。它可設置為 pre、post 或 sync。
    pre:默認值,當監(jiān)聽的值發(fā)生變更時,優(yōu)先執(zhí)行回調(diào)函數(shù)(在dom更新之前執(zhí)行)。
    post:dom更新渲染完畢后,執(zhí)行回調(diào)函數(shù)。
    sync:一旦監(jiān)聽的值發(fā)生了變化,同步執(zhí)行回調(diào)函數(shù)(建議少用)。

一,監(jiān)聽單個數(shù)據(jù)ref

const count = ref(1);
watch(count, (newValue, oldValue) => {
  console.log('值發(fā)生了變更', newValue, oldValue);
});

可以獲取到新值和舊值。

二,監(jiān)聽引用類型數(shù)據(jù)ref:深度監(jiān)聽

const count = ref({
  a: 1,
  b: 2
});
const handleClick = function () {
 count.value.a = 5;
};
watch(count, (newValue, oldValue) => {
  console.log('值發(fā)生了變更', newValue, oldValue);
});

這種情況下,我監(jiān)聽的是整個數(shù)組,它是引用數(shù)據(jù)類型,內(nèi)部的某一項發(fā)生了變更并不會被監(jiān)聽到。所以watch中的代碼并沒有執(zhí)行。

1,引用類型ref直接深度監(jiān)聽

此時,就需要使用深度監(jiān)聽:deep:true

const count = ref({
  a: 1,
  b: 2
});
const handleClick = function () {
  count.value.a = 5;
};
watch(
  count,
  (newValue, oldValue) => {
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { deep: true }
);

值發(fā)生了變更 Proxy {a: 5, b: 2} Proxy {a: 5, b: 2}

可以注意到的是,深度監(jiān)聽的需要是這個引用數(shù)據(jù)類型自身,而不是其中的屬性。并且,他只能獲取到新值,而獲取不到舊的值。

2,引用類型ref深拷貝深度監(jiān)聽

const count = ref({
  a: 1,
  b: 2
});
const handleClick = function () {
  count.value.a = 5;
};
watch(
  () => {
    return { ...count.value };
  },
  (newValue, oldValue) => {
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { deep: true }
);

這樣把watch的引用類型數(shù)據(jù)源深拷貝一份,即可完成對新舊值得獲取:

值發(fā)生了變更 {a: 5, b: 2} {a: 1, b: 2}

三,監(jiān)聽單個數(shù)據(jù):reactive

const single = reactive({ count: 1, test: 2 });
const handleClick = function () {
  single.count++;
};
watch(
  () => single.count,
  (newValue, oldValue) => {
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { immediate: true }
);

這里主要是() => single.count,監(jiān)聽的是single中的count,只有這個屬性發(fā)生了變化才會觸發(fā)回調(diào)函數(shù)。這種情況下是可以獲取到新舊值的。

四,監(jiān)聽引用類型數(shù)據(jù):reactive

<template>
  <div class="mine-box">
    <div ref="countDom">{{ single.count }}</div>
    <button @click="handleClick">按鈕</button>
  </div>
</template>

<script setup>
import { ref, reactive, watch } from 'vue';
const single = reactive({ count: 1, test: { a: 1, b: 2 } });
const handleClick = function () {
  single.test.a++;
};
watch(
  single,
  (newValue, oldValue) => {
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { immediate: true }
);
</script>

reactive的數(shù)據(jù),用不用deep:true是沒有影響的,single中的一個屬性發(fā)生了變化,都能被監(jiān)聽到,繼而執(zhí)行回調(diào)函數(shù)。

和三中有所不同的是,這種情況下是只能獲取到新值的。

五,immediate: true

默認情況下watch是惰性的,當我們設置immediate: true時,watch會在初始化時立即執(zhí)行回調(diào)函數(shù)。

const count = ref(1);
const handleClick = function () {
  count.value++;
};
watch(
  count,
  (newValue, oldValue) => {
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { deep: true, immediate: true }
);

六,監(jiān)聽多個數(shù)據(jù)源

const count = ref(1);
const double = ref(2);
const handleClick = function () {
  count.value++;
  double.value++;
};
watch(
  [count, double],
  (newValue, oldValue) => {
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { deep: true, immediate: true }
);

有一個值發(fā)生了變更,則會觸發(fā)watch,如果兩個值同時發(fā)生變更,同樣只是觸發(fā)一次watch的回調(diào)函數(shù)。

如果想變更一格數(shù)據(jù)就觸發(fā)一次回調(diào),可以在兩個數(shù)據(jù)變更中間加下nextTick。

七,flush的配置

1,默認情況下在dom渲染完畢前調(diào)用回調(diào)函數(shù)

默認情況下,flush的值是pre,當監(jiān)聽的值發(fā)生變更時,優(yōu)先執(zhí)行回調(diào)函數(shù)(在dom更新之前執(zhí)行)。這就意味著,如果在回調(diào)函數(shù)中有相關dom的操作,而參數(shù)里面配置了immediate:true,則會報錯,因為這個時候dom還沒有被渲染,是獲取不到dom的。

接下來看下代碼:

<template>
  <div class="mine-box">
    <div ref="countDom">{{ count }}</div>
    <button @click="handleClick">按鈕</button>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';
const count = ref(1);
const countDom = ref(null);
const handleClick = function () {
  count.value++;
};
watch(
  count,
  (newValue, oldValue) => {
    console.log('---', countDom.value.textContent);
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { deep: true }
);
</script>

得到的結(jié)果:

--- 1值發(fā)生了變更 2 1

可以看到,回調(diào)函數(shù)中新的值已經(jīng)變成了2,而獲取到的dom還是之前的。說明默認情況下,flush的值是pre,當有值變更時,是在dom更新之前觸發(fā)回調(diào)函數(shù)的執(zhí)行。

2,flush: 'post’在dom渲染完畢后執(zhí)行回調(diào)函數(shù)

<template>
  <div class="mine-box">
    <div ref="countDom">{{ count }}</div>
    <button @click="handleClick">按鈕</button>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';
const count = ref(1);
const countDom = ref(null);
const handleClick = function () {
  count.value++;
};
watch(
  count,
  (newValue, oldValue) => {
    console.log('---', countDom.value.textContent);
    console.log('值發(fā)生了變更', newValue, oldValue);
  },
  { deep: true, flush: 'post' }
);
</script>

得到的結(jié)果:

--- 2值發(fā)生了變更 2 1

可以看到,是在dom更新完畢之后才調(diào)用的回調(diào)函數(shù),這時候獲取到的dom是數(shù)據(jù)變更后更新完畢的dom。

八,總結(jié)

當使用ref創(chuàng)建的響應式數(shù)據(jù)時。

1,基本數(shù)據(jù)類型:可以直接監(jiān)聽,可獲取新舊值。
2,引用數(shù)據(jù)類型:需要deep:true深度監(jiān)聽,但是只能獲取新值。要想獲取新舊值,要想獲取新舊值,需要監(jiān)聽目標數(shù)據(jù)的深拷貝。

當使用reactive創(chuàng)建的響應式數(shù)據(jù)時。

1,基本數(shù)據(jù)類型:可以直接指定某個屬性進行監(jiān)聽,可以獲取到新舊值。
2,引用數(shù)據(jù)類型:直接監(jiān)聽創(chuàng)建的reactive對象,其中只要有屬性變更,都能被監(jiān)聽到。但是它只能獲取到新值。
3,reactive創(chuàng)建的響應式數(shù)據(jù),深度監(jiān)聽設置是無效的,也就是deep:true/false都是能監(jiān)聽到的。

deep參數(shù)

默認是false,只有使用ref創(chuàng)建的響應式引用類型的數(shù)據(jù)是,才啟用。才生效。

immediate參數(shù)

默認是false,初始化的時候不執(zhí)行回調(diào)函數(shù)。如果是true,初始化的時候就會執(zhí)行一次回調(diào)函數(shù)。

flush參數(shù)

默認是'pre',在dom渲染之前執(zhí)行回調(diào)函數(shù),如果有immediate:true時,回調(diào)函數(shù)有獲取dom操作,則會報錯,因為初始化時dom還沒生成。
設置成'post',則是在dom渲染完畢(監(jiān)聽的數(shù)據(jù)變更后dom渲染完畢)后,再執(zhí)行回調(diào)函數(shù)。

總結(jié)

到此這篇關于vue3下watch的使用的文章就介紹到這了,更多相關vue3 watch使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格

    vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格

    這篇文章主要介紹了vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Vue中動態(tài)Class實戰(zhàn)示例

    Vue中動態(tài)Class實戰(zhàn)示例

    這篇文章主要為大家介紹了Vue中動態(tài)Class的實戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • vue之el-menu-item如何更改導航菜單欄選中的背景顏色

    vue之el-menu-item如何更改導航菜單欄選中的背景顏色

    這篇文章主要介紹了vue之el-menu-item如何更改導航菜單欄選中的背景顏色問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue @click與@click.native,及vue事件機制的使用分析

    vue @click與@click.native,及vue事件機制的使用分析

    這篇文章主要介紹了vue @click與@click.native,及vue事件機制的使用分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue?el-input設置必填提示功能(單個與多個)

    vue?el-input設置必填提示功能(單個與多個)

    有的功能需要設置必填項,當然也需要判斷是不是添上了,下面這篇文章主要給大家介紹了關于vue?el-input設置必填提示功能(單個與多個)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • vue中的任務隊列和異步更新策略(任務隊列,微任務,宏任務)

    vue中的任務隊列和異步更新策略(任務隊列,微任務,宏任務)

    這篇文章主要介紹了vue中的任務隊列和異步更新策略(任務隊列,微任務,宏任務),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue-router history模式下的微信分享小結(jié)

    vue-router history模式下的微信分享小結(jié)

    本篇文章主要介紹了vue-router history模式下的微信分享小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 圖文詳解Element-UI中自定義修改el-table樣式

    圖文詳解Element-UI中自定義修改el-table樣式

    elementUI提供的組件間距、樣式都比較大,如果直接套用,在頁面顯示可能就會顯得很大,就比如表格,表頭、行寬如果不修改的話,遇到列較多的時候,會顯得整個頁面就不好看,下面這篇文章主要給大家介紹了關于Element-UI中自定義修改el-table樣式的相關資料,需要的朋友可以參考下
    2022-08-08
  • vue前端編譯報錯的圖文解決方法

    vue前端編譯報錯的圖文解決方法

    Vue框架可以很方便的引入各種插件,但是也因此會經(jīng)常遇到種編譯報錯,這篇文章主要給大家介紹了關于vue前端編譯報錯解決的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Vue實現(xiàn)todo應用的示例

    Vue實現(xiàn)todo應用的示例

    這篇文章主要介紹了Vue實現(xiàn)todo應用的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下
    2021-02-02

最新評論