Day_20 : 让 Vite 来开启你的Vue 之 watch & watchEffect

Hi Dai Gei Ho~ 我是Winnie~

在今天文章中, 我们要来说的Composition API 中的 watch 与 watchEffect。首先我们先来说说 大家比较熟悉的 watch:

watch

在 Composition API 中 watch 的 主要作用 其实还是与 过去相同的,而在watch()用法上,需改为一个 函式 的语法来使用 。

用法如下:

<template>

  <div>
      {{name}} <button @click="setName">隐姓埋名</button>
  </div>
</template>

<script>
import {ref, reactive ,watch } from 'vue';

export default({
  setup() {
      const name =ref('winnie') 
      const setName = () => {
          name.value = '大侠爱吃汉堡饱'
      }
      
      //观察一个ref物件
      watch(name, (val,oldVa)=>{
        console.log('newName:'${val},'oldName:'${oldVal});
      })
      return {
          name,
          setName,
      }
  }
});
</script>

预览:

从上方我们可以看到,当我们监听一个资料状态时,watch()中第一个参数为观察ref物件,第二个参数为一个callBack ,当状态更新,就会针对其来执行callback。

如果是 reactive 中的其中一属性呢?

我们可以将 watch()第一个参数改为 有回传值的 getter函式,用法如下:

//略...
<script>
import {reactive,watch } from 'vue';

//略..
       const name = reactive({
         initName : 'winnie',
         setName: name.initName = '大侠爱吃汉堡饱'
      }) 
 
      watch(
      ()=> name.initName, // 观察一个getter
      (name,oldName)=>{
            console.log('newName:'${val},'oldName:'${oldVal});
      })
//略..

观察多笔 资料

如果今天有多笔资料需要 被观察,我们可以透过 阵列的方式来带入第一个参数之中,同时被观察。

//略...
<script>
import {reactive,watch } from 'vue';

//略..
       const name = reactive({
         initName : 'winnie',
         setName: name.initName = '大侠爱吃汉堡饱',
         fakeName: 'Banana',
         setFake :  name.fakeName='你不是大侠吃香蕉'
      }) 
 
      watch(
      [()=> name.initName,()=> name.fakeName], //  使用阵列侦听多笔
      ([name,fakeName],[oldName,oldFakeName])=>{
      
        console.log('Name:'+name,'oldName:'+oldName);
        console.log('fakeName:'+fakeName,'oldName:'+oldFakeName);
      })
//略..

预览

这边需注意 我们可以从console.log中看到,因为是多笔资料写在一个 watch()之中,所以callback是共用的,如要执行不同动作,可以分开来写。

另外如要针对 物件中的物件深层监听,我们可以在 watch()第三个参数中 加上{deep:true}

// 略..
    watch(state.obj,(val,oldVal)=>{}, {deep:true});
//略..

watchEffect

接着我们要来说的是 在Vue3 Composition API 中 新增加的 API : watchEffect:


export default{
  setup(){
    const name =ref('winnie')
    const setName = ()=> name.value = '大侠爱吃汉堡饱'
    
    watchEffect(()=>{
        console.log(name.value)
    
    })
  }
}

从上我们可以看到 ,watchEffect()不用指定要监听的目标,只要在callback函式中对应响应式资料更新後就会依照对应资料来执行了,而与 watch 不同的是,watchEffect()在初始setup()的时候,就会先执行一次了。

解除 watchEffect监听

在每一个 watchEffect()中都会回传一个专属的 WachStopHandle 函式。如果想要停止监听,可以直接呼叫其来停止监听。

    
    const stop = watchEffect(()=>{
        console.log(name.value)
    })
    
    stop();

以上就是今天的文章,如有问题欢迎大家多多指教,谢谢。


<<:  MyBatis 设定

>>:  JS Library 学习笔记:嘿!有听过 GSAP 吗? (二)

DAY16:清单元件之简介

今天要来介绍的是清单列表,像是我们平常打开IG或FB的通知栏时或是通讯软件的聊天室列表跟好友列表就都...

[Day21] Flutter - Presentation AutoRouter(part5)

前言 Hi, 我是鱼板伯爵今天要在我们的专案里面加入场景的路由,这样可以方便管理我们每个场景,教学内...

Day-23 Model 可以重复使用吗? 储存和读取 Model

总算,我们已经会建立自己独一无二的神经网路了~但,你有没有发现一个问题,我们的该不会每次要使用模型...

django新手村13-----路由规则

urls.py str有可以用int path('personal_info<str:name...

网路设备:交换机

来谈谈最容易搞混的交换机和路由器 了解後,往後在Hypervisor看到虚拟网路设备(如 虚拟交换机...