首頁 > 軟體

vue3中watch和watchEffect實戰梳理

2022-07-28 14:01:21

前言

watchwatchEffect都是vue3中的監聽器,但是在寫法和使用上是有區別的,這篇文章主要是介紹一下watchwatchEffect的使用方法以及他們之間的區別。

watch

watch監聽單個資料

<template>
    <input type="text" v-model="text1" />
</template>

<script setup>
import { ref, watch } from 'vue'
const text1 = ref('')

watch(text1, (newVal, oldVal) => {
    console.log('監聽單個資料', newVal, oldVal)
})
</script>

結果:

watch監聽多個資料

<template>
    <input type="text" v-model="text1" />
    <input type="text" v-model="text2" />
</template>

<script setup>
import { ref, watch } from 'vue'
const text1 = ref('')
const text2 = ref('')

watch([text1, text2], (newVal, oldVal) => {
    console.log('監聽一組資料', newVal, oldVal)
})
</script>

結果:

watch監聽物件

<template>
    name: <input type="text" v-model="student.name" />
    age: <input type="number" v-model="student.age" />
</template>
<script setup>
import { reactive, watch } from 'vue'
const student = reactive({
    name: '',
    age: ''
})
watch(student, (newVal, oldVal) => {
    console.log('newVal', newVal)
    console.log('oldVal', newVal)
})
</script>

結果:

 watch還有第三個引數,deepimmediate,可以加上看看效果

watch監聽物件的某一個值

<template>
    name: <input type="text" v-model="student.name" />
    age: <input type="number" v-model="student.age" />
</template>
<script lang="ts" setup>
import { reactive, watch } from 'vue'
const student = reactive({
    name: '',
    age: ''
})
watch(() => student.name, (newVal, oldVal) => {
    console.log('newVal', newVal)
    console.log('oldVal', newVal)
}, {
    deep: true,
    immediate: true
})
</script>

監聽物件某一個屬性的時候需要用箭頭函數 結果: 

watchEffect

關於watchEffect,官網是這麼介紹的:為了根據響應式狀態自動應用和重新應用副作用,我們可以使用watchEffect方法,它立即執行傳入的一個函數,同時響應式追蹤其依賴,並在其依賴變更時重新執行該函數。 也就是說,我們並不需要傳入一個特定的依賴源,而且它會立即執行一遍回撥函數,如果函數產生了副作用,那它就會自動追蹤副作用的依賴關係,自動分析出響應源。光看概念可能比較模糊,先來看個最簡單的例子:

<template>
    name: <input type="text" v-model="student.name" />
    age: <input type="number" v-model="student.age" />
</template>

<script lang="ts" setup>
import { reactive, watchEffect } from 'vue'

const student = reactive({
    name: '',
    age: ''
})
watchEffect(() => {
    console.log('name: ',student.name, 'age: ', student.age)
})
</script>

結果:

watchEffect副作用

副作用,那什麼是副作用呢,其實很簡單,就是在監聽之前,我得做一件事。

<template>
    name: <input type="text" v-model="student.name" />
    age: <input type="number" v-model="student.age" />

    <h2>{{student.name}}</h2>
</template>

<script lang="ts" setup>
import { reactive, watchEffect } from 'vue'

const student = reactive({
    name: '',
    age: ''
})
watchEffect((oninvalidate) => {
    oninvalidate(() => {
        student.name = '張三'
    })
    console.log('name: ', student.name)
}, {
    // pre 元件更新前; sync:強制效果始終同步; post:元件更新後執行
    flush: 'post'  // dom載入完畢後執行
})
</script>

監聽之前讓student.name賦值為'張三',無論你輸入什麼值,name一直都是'張三'

停止監聽

我們用同步語句建立的監聽器,會自動繫結到元件範例上,並且會在元件解除安裝時自動停止,但是,如果我們在非同步回撥裡建立一個監聽器,那它就不會繫結到當前元件上,必須手動去停止,防止記憶體漏失。 那怎麼去停止呢,其實我們只需要呼叫一下watchwatchEffect返回的函數

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

// 停止監聽
unwatch()

區別

用了一遍watchwatchEffect之後,發現他倆主要有以下幾點區別:

  • watch是惰性執行的,而watchEffect不是,不考慮watch第三個設定引數的情況下,watch在元件第一次執行的時候是不會執行的,只有在之後依賴項變化的時候再執行,而watchEffect是在程式執行到此處的時候就會立即執行,而後再響應其依賴變化執行。
  • watch需要傳遞監聽的物件,watchEffect不需要

到此這篇關於vue3中watch和watchEffect實戰梳理的文章就介紹到這了,更多相關vue watch和watchEffect 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com