Vue3基础(五)___watch

简介: 本文介绍了Vue 3中`watch`函数的使用方法,包括如何监听单个响应式数据的变化以及如何监听多个响应式数据的变化。通过示例代码,文章展示了`watch`在监测数据更新时的反应,并解释了其在Vue 3组合式API中的作用。

watch

<template>
  <div>
    <p>姓名:{
   {
   obj.name}}</p>
    <p>年龄:{
   {
   obj.age}}</p>
    <button @click="ageFun">年龄加一</button>
    <p v-for="(item,index) in obj.habby" :key="index">爱好{
   {
   index+1}}:{
   {
   item}}</p>
    <!-- <button @click="goClick">跳转到第二个页面</button> -->
  </div>
</template>

<script>
import {
    ref, reactive,watch } from "vue";
export default {
   
  name: "App",
  setup() {
   
function reactiveF() {
   
  let obj = reactive({
   
    name: "zjq",
    age: 18,
    habby: ["跳舞", "唱歌", "游泳"]
  });
  function ageFun() {
   
    obj.age++;
  }
  return {
    obj, ageFun };
}
  let  {
    obj, ageFun } =reactiveF()
     watch(  ()=>obj.age,
      (newParams,oldParams) => {
   
        console.log("这是新的值")
        console.log(newParams)
        console.log("这是旧的值")
        console.log(oldParams)
      })
    return {
    obj, ageFun };
  }
};
</script>

我们在点击页面按钮的时候让年龄加1,watch是个函数,第一个参数是要监听的对象,第二个参数是个回调,回调的第一个和第二个参数分别代表新值、旧值。
在这里插入图片描述
上面的是对应一个对象的某个属性监听的写法,第一个参数必须为回调函数,我们要想直接监听obj对象的话,就可以直接

     watch( obj,
      (Params) => {
   
        console.log("这是改变后的值")
        console.log(Params)
      })

因为监听的不再是一个基本数据,而是一个对象,所以,新值、旧值就无所谓了,都一样。
在这里插入图片描述
例子1:

  let obj = reactive({
   
    name: "zjq",
    age: {
   value:18},
    habby: ["跳舞", "唱歌", "游泳"]
  });
 watch(  ()=>obj.age.value,
      (newParams,oldParams) => {
   
        console.log("这是新的值")
        console.log(newParams)
        console.log("这是旧的值")
        console.log(oldParams)
      })

在这里插入图片描述
例子1:

  let obj = reactive({
   
    name: "zjq",
    age: {
   value:18},
    habby: ["跳舞", "唱歌", "游泳"]
  });
     watch(  obj.age,
      (newParams,oldParams) => {
   
        console.log("这是新的值")
        console.log(newParams)
        console.log("这是旧的值")
        console.log(oldParams)
      })

在这里插入图片描述
总结:监听的是一个基本数据类型的时候,watch第一个参数需要使用箭头函数return 出去,监听的是一个对象的时候,第一个参数直接就是监听对象。

watch监听多个对象

watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
   
  /* ... */
})
<template>
  <div>
    <p>姓名:{
   {
   obj.name}}</p>
    <p>年龄:{
   {
   obj.age}}</p>
    <button @click="ageFun">年龄加一</button>
    <p v-for="(item,index) in obj.habby" :key="index">爱好{
   {
   index+1}}:{
   {
   item}}</p>
    <!-- <button @click="goClick">跳转到第二个页面</button> -->
  </div>
</template>

<script>
import {
    ref, reactive,watch } from "vue";
export default {
   
  name: "App",
  setup() {
   
function reactiveF() {
   
  let obj = reactive({
   
    name: "zjq",
    age: {
   value:18},
    habby: ["跳舞", "唱歌", "游泳"]
  });
  function ageFun() {
   
    obj.age.value++;
    obj.name = '改变后的name'
  }
  return {
    obj, ageFun };
}
  let  {
    obj, ageFun } =reactiveF()
     watch(  [()=>obj.age.value,()=>obj.name],
      ([newParams1,newParams2],[oldParams1,oldParams2]) => {
   
        console.log("这是新的值")
        console.log(newParams1,newParams2)
        console.log("这是旧的值")
        console.log(oldParams1,oldParams2)
      })
    return {
    obj, ageFun };
  }
}
</script>

同样,在监听value是一个基本数据类型的时候,第一个参数需要使用箭头函数return出去。
在这里插入图片描述

同样试一下监听对象

<template>
  <div>
    <p>姓名:{
   {
   obj.name}}</p>
    <p>年龄:{
   {
   obj.age}}</p>
    <button @click="ageFun">年龄加一</button>
    <p v-for="(item,index) in obj.habby" :key="index">爱好{
   {
   index+1}}:{
   {
   item}}</p>
    <!-- <button @click="goClick">跳转到第二个页面</button> -->
  </div>
</template>

<script>
import {
    ref, reactive,watch } from "vue";
export default {
   
  name: "App",
  setup() {
   
function reactiveF() {
   
  let obj = reactive({
   
    name: "zjq",
    age: {
   value:18},
    habby: ["跳舞", "唱歌", "游泳"]
  });
  let obj1 = reactive({
   
    name: "obj1",
    age: {
   value:"obj1"},
    habby: ["跳舞", "唱歌", "游泳"]
  });
  function ageFun() {
   
    obj.age.value++;
    obj1.name = '改变后的name'
  }
  return {
    obj, ageFun,obj1 };
}
  let  {
    obj,obj1, ageFun } =reactiveF()
     watch(  [obj,obj1],
      ([newParams1,newParams2],[oldParams1,oldParams2]) => {
   
        console.log("这是新的值")
        console.log(newParams1,newParams2)
        console.log("这是旧的值")
        console.log(oldParams1,oldParams2)
      })
    return {
    obj, ageFun };
  }
};
</script>

在这里插入图片描述
同样,对于监听的值是对象,我们可以只写第二个参数中(回调函数),只写一个参数,因为新值和旧值是一样的,引用数据类型;

ref底层实现是reactive
ref(0)reactive({
   value:0})

我们将一个对象变成响应式的,当我们改变响应式数据页面ui可以变化,但是改变原始数据是不会发生变化的,即使他们的引用地址一样。

每天学习一点点~

目录
相关文章
|
10月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
1225 139
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
1492 5
|
10月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
634 1
|
11月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
1110 11
|
10月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
699 0
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
1147 1
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
573 0
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
1294 17
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
285 0
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
2423 0