vue3+ts watch 整理

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

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

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

ref定义的数据。

reactive定义的数据。

函数返回一个值(getter函数)。

一个包含上述内容的数组
ref 定义的数据

复制代码
<template>
  <div>str===={{ str }}</div>
  <div>perosn 的name===={{ personObj.name }}</div>
  <div>Person 的age===={{ personObj.age }}</div>
  <div>Person的Car===={{ personObj.car }}</div>
  <div>Person的Car.color===={{ personObj.car.color }}</div>
  <div>Person的Car.price===={{ personObj.car.price }}</div>
  <div>
    <el-button @click="editPerson">点击修改部分属性</el-button>
    <el-button @click="editPersonAll">点击修改全部</el-button>
    <el-button @click="editString">修改基本数据类型</el-button>
  </div>
</template>

<script setup lang="ts">
import { reactive, watch, ref, toRefs, Ref } from "vue";
interface Person {
  name: string;
  age: number;
  car: {
    price: number;
    color: string;
  };
}
// let str: Ref<string> = ref("AAA"); // 泛型写法
let str = ref("AAA");
let personObj = ref<Person>({
  name: "aaa",
  age: 12,
  car: {
    price: 12,
    color: "reds",
  },
});
const editPerson = () => {
  personObj.value.name = "bbb";
};
const editPersonAll = () => {
  personObj.value.car = {
    price: 222,
    color: "blue",
  };
};

const editString = () => {
  str.value = "Bbb";
};
// 监听基本数据类型变化
watch(
  () => str.value,
  (newValue, oldValue) => {
    console.log("监听基本数据类型变化newValue");
    console.log(newValue);
    console.log(oldValue);
  }
);
// 监听对象类型某个值的变化
watch(
  () => personObj.value.name,
  (newValue, oldValue) => {
    console.log("personObj.value.name");
    console.log("newValue==" + newValue);
    console.log("oldValue==" + oldValue);
  }
);

/* 
    监视,情况一:监视【ref】定义的【对象类型】数据,监视的是对象的地址值,若想监视对象内部属性的变化,需要手动开启深度监视
    watch的第一个参数是:被监视的数据
    watch的第二个参数是:监视的回调
    watch的第三个参数是:配置对象(deep、immediate等等.....) 
  */
watch(
  personObj,
  (newValue, oldValue) => {
    console.log("修改整个车");
    console.log("newValue==");
    let { car, name, age } = toRefs(newValue);
    console.log(car, name.value, age.value);
    console.log("oldValue==");
    // let {car,name,age} = toRefs(oldValue)
    // console.log(car,name,age);
  },
  {
    deep: true,
  }
);
</script>

<style scoped></style>

reactive 定义的数据

ref 写法

复制代码
<template>
  <div>perosn 的name===={{ personObj.name }}</div>
  <div>Person 的age===={{ personObj.age }}</div>
  <div>Person的Car===={{ personObj.car }}</div>
  <div>Person的Car.color===={{ personObj.car.color }}</div>
  <div>Person的Car.price===={{ personObj.car.price }}</div>
  <div>
    <el-button @click="editPerson">点击修改部分属性</el-button>
    <el-button @click="editPersonAll">点击修改全部</el-button>
  </div>
</template>
<script setup lang="ts">
import { reactive, watch, ref } from "vue";
interface Person {
  name: string;
  age: number;
  car: {
    price: number;
    color: string;
  };
}
let personObj = reactive<Person>({
  name: "aaa",
  age: 12,
  car: {
    price: 12,
    color: "reds",
  },
});
const editPerson = () => {
  personObj.name = "bbb";
};
const editPersonAll = () => {
  personObj.car = {
    price: 222,
    color: "blue",
  };
};
//监听基本数据类型的写法
watch(
  () => personObj.name,
  (newValue, oldValue) => {
    console.log("newValue==" + newValue);
    console.log("oldValue==" + oldValue);
  }
);
监听对象类型的写法 (推荐使用这种方法)
// watch(
//   () => personObj.car,
//   (newValue, oldValue) => {
//     console.log("修改整个车");
//     console.log("newValue==" + newValue);
//     console.log("oldValue==" + oldValue);
//   }
// );
监听对象类型的写法
watch(personObj.car, (newValue, oldValue) => {
  console.log("修改整个车");
  console.log("newValue==" + newValue);
  console.log("oldValue==" + oldValue);
});
</script>

监听多个值变化

ref 写法

复制代码
<template>
  <div>perosn 的name===={{ personObj.name }}</div>
  <div>Person 的age===={{ personObj.age }}</div>
  <div>Person的Car===={{ personObj.car }}</div>
  <div>Person的Car.color===={{ personObj.car.color }}</div>
  <div>Person的Car.price===={{ personObj.car.price }}</div>
  <div>
    <el-button @click="editPersonName">点击修改name</el-button>
    <el-button @click="editPersonCarColor">点击修改car-color</el-button>
  </div>
</template>

<script setup lang="ts">
import { tr } from "element-plus/es/locales.mjs";
import { reactive, watch, ref, toRefs, Ref } from "vue";
interface Person {
  name: string;
  age: number;
  car: {
    price: number;
    color: string;
  };
}
let personObj = ref<Person>({
  name: "aaa",
  age: 12,
  car: {
    price: 12,
    color: "reds",
  },
});
const editPersonName = () => {
  personObj.value.name = "bbb";
};
const editPersonCarColor = () => {
  personObj.value.car.color = "bule";
};

// 监听对象类型某个值的变化
// 传入的是数组, 获取到的newValue 也是数组,一一对应的关系
watch(
  [() => personObj.value.name, personObj.value.car],
  (newValue, oldValue) => {
    console.log("personObj.value--watch");
    console.log(newValue);
    console.log(oldValue);
  },
  {
    deep: true,
  }
);
</script>

<style scoped></style>

reactive 写法

复制代码
<template>
  <div>perosn 的name===={{ personObj.name }}</div>
  <div>Person 的age===={{ personObj.age }}</div>
  <div>Person的Car===={{ personObj.car }}</div>
  <div>Person的Car.color===={{ personObj.car.color }}</div>
  <div>Person的Car.price===={{ personObj.car.price }}</div>
  <div>
    <el-button @click="editPersonName">点击修改name</el-button>
    <el-button @click="editPersonCarColor">点击修改car-color</el-button>
  </div>
</template>

<script setup lang="ts">
import { tr } from "element-plus/es/locales.mjs";
import { reactive, watch, ref, toRefs, Ref } from "vue";
interface Person {
  name: string;
  age: number;
  car: {
    price: number;
    color: string;
  };
}
let personObj = reactive<Person>({
  name: "aaa",
  age: 12,
  car: {
    price: 12,
    color: "reds",
  },
});
const editPersonName = () => {
  personObj.name = "bbb";
};
const editPersonCarColor = () => {
  personObj.car.color = "bule";
};

// 监听对象类型某个值的变化
// 传入的是数组, 获取到的newValue 也是数组,一一对应的关系
watch(
  [() => personObj.name, personObj.car],
  (newValue, oldValue) => {
    console.log("personObj.value--watch");
    console.log(newValue);
    console.log(oldValue);
  },
  {
    deep: true,
  }
);
</script>

<style scoped></style>
相关推荐
RuoyiOffice4 天前
SpringBoot3+Vue3 最推荐的开源 OA 系统 2026:流程驱动、资源闭环、多端互通
spring boot·vue3·flowable·oa·协同办公·spring boot 3·开源oa
鱼与宇5 天前
Element-plus离线访问(适用内网)
elementui·vue3
我就是DaLing呀!7 天前
vue3 + 独立的数据管理 Store实现视频剪辑功能
前端·typescript·vue3·canvas·store
我才是银古10 天前
当 360° 全景遇上真实地图:Vue 3 实现全景-地图双向联动的工程实践
3d·vue3·360影像
XLYcmy11 天前
HTML/CSS/JS 基础与 Vue 技术栈深度解析
java·前端·css·html·vue3·vue2·api
码视野14 天前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
码视野14 天前
基于 Spring Boot + Vue3 的【高校化学实验室安全准入考试与危化品配伍排查系统】设计与实现(含PRD/三端高保真源码/大屏)
前端·人工智能·spring boot·后端·安全·vue3
fxshy14 天前
WebGIS 游戏化实践:基于 Cesium + Vue3 实现全球飞行模拟系统:从球体坐标、飞行动力学到地形碰撞实战
游戏·vue3·cesium·webgis·飞行模拟
jonyleek15 天前
技术实践:基于 Vue3 + Spring Cloud 微服务实现私有化文档系统的类 SaaS 协同体验
微服务·私有化部署·vue3·springcloud·协同编辑·jvs企业文档·无忧企业文档
码视野15 天前
基于 Vue3 + Element Plus 的【智慧社区洗车养车与上门流动洗车预约调度系统】设计与实现(含PRD/三端源码/大屏)
前端·javascript·vue.js·人工智能·vue3