国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue Composition API之偵聽器watch/watchEffect

這篇具有很好參考價值的文章主要介紹了Vue Composition API之偵聽器watch/watchEffect。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概述

在日常的開發(fā)中,很多時候我們需要去對一些狀態(tài)進(jìn)行監(jiān)聽,比如當(dāng)顯示學(xué)生的成績列表時,我們使用一個學(xué)生的學(xué)號student_num作為請求成績的參數(shù),如果沒有監(jiān)聽機制,當(dāng)學(xué)號student_num改變時,我們需要依賴用戶的操作去刷新成績。但是有了偵聽器,我們可以通過偵聽器去監(jiān)聽student_num,當(dāng)其發(fā)生改變時,自動去執(zhí)行成績刷新的操作。省去了很多冗余的邏輯。在Vue中,偵聽器主要有兩個,watch和watchEffect。下文將主要介紹他們的用法和區(qū)別。

實例解析

1.watch偵聽器的用法

基本使用

我們可以使用 watch 函數(shù)在每次響應(yīng)式狀態(tài)發(fā)生變化時觸發(fā)回調(diào)函數(shù),下面的代碼中,我們監(jiān)聽一個name屬性的值,使用一個輸入框輸入name的不同值,當(dāng)name的值改變時觸發(fā)回調(diào),代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>watch偵聽器的使用</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
 const app = Vue.createApp({
    setup(props,context){
        const {ref,watch} = Vue;
        const name = ref('walt');
        // 具備懶加載
        // 參數(shù)可以拿到原始值和當(dāng)前值
        // 用一個偵聽器可以監(jiān)聽多個數(shù)據(jù)
        watch(name,(currentValue,prevValue)=>{
            console.log(currentValue,prevValue);
        })
        return {name}
    },
   template:
         `
          <div>
            <div>Name:<input v-model="name"></div>
          </div>
         `
 });    
 const vm = app.mount('#root');
</script>

運行結(jié)果:
Vue Composition API之偵聽器watch/watchEffect

從上面的代碼中我們可以看到,傳入的第一個參數(shù)name使用了ref包裝,使其具有了響應(yīng)式的屬性,其實,watch 的第一個參數(shù)可以是不同形式的“數(shù)據(jù)源”:它不僅可以是一個 ref (包括計算屬性)、還可以是一個響應(yīng)式對象、一個 getter 函數(shù)、或多個數(shù)據(jù)源組成的數(shù)組,如下所示:

const x = ref(0)
const y = ref(0)

// 單個 ref
watch(x, (newX) => {
  console.log(`x is ${newX}`)
})

// getter 函數(shù)
watch(
  () => x.value + y.value,
  (sum) => {
    console.log(`sum of x + y is: ${sum}`)
  }
)

// 多個來源組成的數(shù)組
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})

注意:我們不能直接監(jiān)聽對象的屬性,比如下列的做法是不對的

 // 不正確的寫法
    setup(props,context){
        const {watch,reactive,toRefs} = Vue;
        const nameObj = reactive({name:'walt'});
        watch(nameObj.name,(currentValue,prevValue)=>{
            console.log(currentValue,prevValue);
        })
        const {name} = toRefs(nameObj)
        return {name} 
    }

如上面的代碼所示,直接監(jiān)聽對象的屬性是不行的,需要提供一個返回該屬性的getter函數(shù),正確的寫法如下所示:

// 正確寫法
   setup(props,context){
        const {watch,reactive,toRefs} = Vue;
        const nameObj = reactive({name:'walt'});
        watch(()=>nameObj.name,(currentValue,prevValue)=>{
            console.log(currentValue,prevValue);
        })
        const {name} = toRefs(nameObj)
        return {name} 
    }

深層偵聽器

這里引用官網(wǎng)的例子解釋, 直接給 watch() 傳入一個響應(yīng)式對象,會隱式地創(chuàng)建一個深層偵聽器——該回調(diào)函數(shù)在所有嵌套的變更時都會被觸發(fā):

const obj = reactive({ count: 0 })

watch(obj, (newValue, oldValue) => {
  // 在嵌套的屬性變更時觸發(fā)
  // 注意:`newValue` 此處和 `oldValue` 是相等的
  // 因為它們是同一個對象!
})

obj.count++

相比之下,一個返回響應(yīng)式對象的 getter 函數(shù),只有在返回不同的對象時,才會觸發(fā)回調(diào):

watch(
  () => state.someObject,
  () => {
    // 僅當(dāng) state.someObject 被替換時觸發(fā)
  }
)

我們可以添加deep :true,來將上面的例子轉(zhuǎn)換成深層偵聽器,代碼如下:

watch(
  () => state.someObject,
  (newValue, oldValue) => {
    // 注意:`newValue` 此處和 `oldValue` 是相等的
    // *除非* state.someObject 被整個替換了
  },
  { deep: true }
)

需要注意的是,深層偵聽器會遍歷被偵聽對象的嵌套屬性,為了性能考慮,謹(jǐn)慎使用

即時回調(diào)監(jiān)聽器

watch 默認(rèn)是懶執(zhí)行的:僅當(dāng)數(shù)據(jù)源變化時,才會執(zhí)行回調(diào)。但在某些場景中,我們希望在創(chuàng)建偵聽器時,立即執(zhí)行一遍回調(diào)。比如,我們想請求一些初始數(shù)據(jù),然后在相關(guān)狀態(tài)更改時重新請求數(shù)據(jù)。
我們可以通過傳入 immediate: true 選項來強制偵聽器的回調(diào)立即執(zhí)行,代碼如下:

watch(source, (newValue, oldValue) => {
  // 立即執(zhí)行,且當(dāng) `source` 改變時再次執(zhí)行
}, { immediate: true })

2、watchEffect偵聽器的用法·

watchEffect幀聽器是立即執(zhí)行的,它不像watch是懶加載的,而且它不需要傳遞要偵聽的內(nèi)容,會自動感知代碼依賴,不需要傳遞很多參數(shù),只需要傳遞一個回調(diào)函數(shù)就可以。引用Vue官網(wǎng)的例子,比如:當(dāng) todoId 的引用發(fā)生變化時使用偵聽器來加載一個遠(yuǎn)程資源:

const todoId = ref(1)
const data = ref(null)

watch(todoId, async () => {
  const response = await fetch(
    `https://jsonplaceholder.typicode.com/todos/${todoId.value}`
  )
  data.value = await response.json()
}, { immediate: true })

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

watchEffect(async () => {
  const response = await fetch(
    `https://jsonplaceholder.typicode.com/todos/${todoId.value}`
  )
  data.value = await response.json()
})

使用watchEffect,回調(diào)會立即執(zhí)行,不需要指定 immediate: true。在執(zhí)行期間,它會自動追蹤 todoId.value 作為依賴(和計算屬性類似)。每當(dāng) todoId.value 變化時,回調(diào)會再次執(zhí)行。有了 watchEffect(),不再需要明確傳遞 todoId 作為源值

3 停止偵聽器

停止偵聽器
?

在 setup() 或 <script setup> 中用同步語句創(chuàng)建的偵聽器,會自動綁定到宿主組件實例上,并且會在宿主組件卸載時自動停止。因此,在大多數(shù)情況下,不需要關(guān)心怎么停止一個偵聽器。偵聽器必須用同步語句創(chuàng)建:如果用異步回調(diào)創(chuàng)建一個偵聽器,那么它不會綁定到當(dāng)前組件上,必須手動停止,以防內(nèi)存泄漏。如下方這個例子:

<script setup>
import { watchEffect } from 'vue'

// 它會自動停止
watchEffect(() => {})

// ...這個則不會!
setTimeout(() => {
  watchEffect(() => {})
}, 100)
</script>

要手動停止一個偵聽器,請調(diào)用 watch 或 watchEffect 返回的函數(shù):

const stop= watchEffect(() => {})

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

總結(jié)

至此,本文已經(jīng)介紹完了watch和watchEffect幀聽器的使用和注意點,最后總結(jié)下兩個偵聽器的區(qū)別,watch具備懶加載,參數(shù)可以拿到原始值和當(dāng)前值,用一個偵聽器可以監(jiān)聽多個數(shù)據(jù);而watchEffect偵聽器是立即執(zhí)行的,不需要傳遞要偵聽的內(nèi)容,它會自動感知代碼依賴,但是watchEffect無法獲取改變之前的值文章來源地址http://www.zghlxwxcb.cn/news/detail-473737.html

到了這里,關(guān)于Vue Composition API之偵聽器watch/watchEffect的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)頁面數(shù)據(jù)偵聽器,類似vue的watch

    既然小程序的組件已經(jīng)有Observer功能,那為什么還要手寫watch功能呢? Observer只能在Component中使用,沒法在Page中使用。若是想在Page中監(jiān)控某一數(shù)據(jù)的變化,Observer做不到。 Observer屬于小程序的新功能,只能在高版本微信使用,低版本微信無法使用。公司的小程序就因為使用了

    2024年02月03日
    瀏覽(26)
  • Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽

    Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽

    Vue3前端開發(fā),watch偵聽器的深度監(jiān)聽和精確監(jiān)聽!今天和大家分享的內(nèi)容是,關(guān)于watch的深度偵聽和精確監(jiān)聽。 首先看一下,第一個案例,練習(xí)的是,深度監(jiān)聽的效果。默認(rèn)是淺的偵聽,是不會觸發(fā)回調(diào)函數(shù)的。 如圖,當(dāng)我們點擊按鈕,修改num值的時候,觸發(fā)了回調(diào)函數(shù),在

    2024年01月23日
    瀏覽(20)
  • GuLi商城-前端基礎(chǔ)Vue-計算屬性computed和偵聽器watch
  • 前端Vue入門-day02-vue指令、computed計算屬性與watch偵聽器

    前端Vue入門-day02-vue指令、computed計算屬性與watch偵聽器

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 指令補充 指令修飾符 v-bind 對于樣式控制的增強? 操作class 案例:京東秒殺 tab 導(dǎo)航高亮 操作style? v-model 應(yīng)用于其他表單元素? computed 計算屬性 基礎(chǔ)語法 computed 計算屬

    2024年02月11日
    瀏覽(53)
  • Vue3 計算屬性和偵聽器實戰(zhàn)(computed、watch)——簡易點餐頁面

    Vue3 計算屬性和偵聽器實戰(zhàn)(computed、watch)——簡易點餐頁面

    這篇文章記錄一下 Vue3 計算屬性和偵聽器 (computed、watch) 實戰(zhàn)的內(nèi)容,這篇文章我們在有計算屬性和偵聽器的基礎(chǔ)上,我們來制作一個簡易點餐頁面,接下來我們一起來從零到一開始制作。 計算屬性和偵聽器相關(guān)文章推薦: 深入與淺談 Vue 中計算屬性和偵聽器的區(qū)別和使用

    2024年02月09日
    瀏覽(33)
  • Vue——偵聽器

    目錄 基本示例? 深層偵聽器? 即時回調(diào)的偵聽器? 回調(diào)的觸發(fā)時機? this.$watch()? 停止偵聽器? ? ? ? ?計算屬性允許我們聲明性地計算衍生值。然而在有些情況下,我們需要在狀態(tài)變化時執(zhí)行一些“副作用”:例如更改 DOM,或是根據(jù)異步操作的結(jié)果去修改另一處的狀態(tài)

    2023年04月13日
    瀏覽(23)
  • Vue學(xué)習(xí)-計算屬性和偵聽器

    1、計算屬性的定義和原理 1、定義:要用的屬性不存在,要通過已有屬性計算得來。 2、原理:底層借助了Objcet.defineproperty方法提供的getter和setter。 3、get函數(shù)什么時候執(zhí)行? ??(1) 初次讀取時會執(zhí)行一次。 ??(2)當(dāng)依賴的數(shù)據(jù)發(fā)生改變時會被再次調(diào)用。 4、優(yōu)勢:與

    2023年04月18日
    瀏覽(28)
  • VUE教程-基礎(chǔ)-計算屬性和偵聽器

    模板內(nèi)的表達(dá)式非常便利,但是設(shè)計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護(hù)。例如: 在這個地方,模板不再是簡單的聲明式邏輯。你必須看一段時間才能意識到,這里是想要顯示變量? message ?的翻轉(zhuǎn)字符串。當(dāng)你想要在模板中的多

    2024年02月17日
    瀏覽(26)
  • 二、基礎(chǔ)篇 vue計算屬性和偵聽器

    模板內(nèi)的表達(dá)式非常便利,但是設(shè)計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護(hù)。例如: 在這個地方,模板不再是簡單的聲明式邏輯。你必須看一段時間才能意識到,這里是想要顯示變量? message ?的翻轉(zhuǎn)字符串。當(dāng)你想要在模板中的多

    2024年01月18日
    瀏覽(21)
  • 淺談在 Vue2 和 Vue3 中計算屬性和偵聽器的一些變化

    淺談在 Vue2 和 Vue3 中計算屬性和偵聽器的一些變化

    計算屬性 computed 和偵聽器 watch 都是 Vue.js 框架中用來響應(yīng)式更新視圖的重要概念。因此無論是在哪個版本,它們都是不可缺少的概念, 這篇文章就不過多詳細(xì)介紹計算屬性和偵聽器的概念和理論了 ,接下來主要談?wù)?Vue2 和 Vue3 中計算屬性和偵聽器的語法變化和異同。 計算屬

    2023年04月26日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包