Vue3+ts(day04:watch、watchEffect)

本文详细介绍了在Vue3中如何使用watch和watchEffect监控不同类型数据(基本类型和对象)的变化,包括ref和reactive的处理方式,以及何时选择watchEffect的自动依赖追踪特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes

觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学习的可以去b站学习原版视频)

一、watch

watch() 一共可以接受三个参数,侦听数据源、回调函数和配置选项

作用:监视数据的变化(和Vue2中的watch作用一致)

特点:Vue3中的watch只能监视以下四种数据

  1. ref定义的数据。
  2. reactive定义的数据。
  3. 函数返回一个值(getter函数)。
  4. 一个包含上述内容的数组。

我们在Vue3中使用watch的时候,通常会遇到以下几种情况:

情况一

监视ref定义的【基本类型】数据:直接写数据名即可,监视的是其value值的改变。

<template>
  <div class="person">
    <h1>情况一:监视【ref】定义的【基本类型】数据</h1>
    <h2>当前求和为:{
  
  {sum}}</h2>
    <button @click="changeSum">点我sum+1</button>
  </div>
</template>

<script lang="ts" setup name="Person">
  import {ref,watch} from 'vue'
  // 数据
  let sum = ref(0)
  // 方法
  function changeSum(){
    sum.value += 1
  }
  // 监视,情况一:监视【ref】定义的【基本类型】数据
  const stopWatch = watch(sum,(newValue,oldValue)=>{
    console.log('sum变化了',newValue,oldValue)
    if(newValue >= 10){
      stopWatch()
    }
  })
</script>

情况二

监视ref定义的【对象类型】数据:直接写数据名,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视。

注意:

  • 若修改的是ref定义的对象中的属性,newValue 和 oldValue 都是新值,因为它们是同一个对象。
  • 若修改整个ref定义的对象,newValue 是新值, oldValue 是旧值,因为不是同一个对象了。
首先,在 Vue3 中使用 TypeScript,需要安装 `@vue/cli-plugin-typescript` 插件,并在 `tsconfig.json` 文件中进行一些配置。安装完成后,我们需要在 Vue3 中实现切换日历年份的功能,可以通过以下步骤实现: 1. 创建一个日历组件,并定义一个年份属性 `year`。 2. 在组件中使用 `watch` 监听 `year` 属性的变化,当属性变化时,重新渲染对应的数据。 3. 在模板中使用 `v-for` 循环渲染日历数据,并使用 `:key` 绑定每个数据项的唯一标识。 以下是一个示例代码: ```vue <template> <div> <button @click="prevYear">上一年</button> <span>{{ year }}</span> <button @click="nextYear">下一年</button> <table> <tr v-for="month in months" :key="month"> <td>{{ month }}</td> <td v-for="day in days" :key="day">{{ day }}</td> </tr> </table> </div> </template> <script lang="ts"> import { defineComponent, reactive, watch } from &#39;vue&#39;; export default defineComponent({ name: &#39;Calendar&#39;, props: { year: { type: Number, required: true, }, }, setup(props) { const state = reactive({ months: [&#39;Jan&#39;, &#39;Feb&#39;, &#39;Mar&#39;, &#39;Apr&#39;, &#39;May&#39;, &#39;Jun&#39;, &#39;Jul&#39;, &#39;Aug&#39;, &#39;Sep&#39;, &#39;Oct&#39;, &#39;Nov&#39;, &#39;Dec&#39;], days: [], }); const updateDays = () => { // 根据当前年份重新计算日期数据 const daysInMonth = [31, props.year % 4 === 0 ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; state.days = Array.from({ length: daysInMonth[new Date(props.year, 1, 1).getMonth()] }, (_, i) => i + 1); }; // 监听 year 属性变化,重新计算日期数据 watch(() => props.year, updateDays); const prevYear = () => { props.year -= 1; }; const nextYear = () => { props.year += 1; }; updateDays(); return { state, prevYear, nextYear, }; }, }); </script> ``` 在上面的示例代码中,我们通过 `props` 属性传入当前日历的年份,使用 `reactive` 函数创建一个响应式对象 `state`,其中包含了月份和日期数据。使用 `watch` 监听 `props.year` 属性的变化,当属性变化时,重新计算日期数据并更新到 `state.days` 中。在模板中,我们使用 `v-for` 循环渲染月份和日期数据,其中使用 `:key` 绑定每个数据项的唯一标识,以提高渲染效率。最后,我们通过 `prevYear` 和 `nextYear` 方法实现切换年份的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值