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可以变化,但是改变原始数据是不会发生变化的,即使他们的引用地址一样。

每天学习一点点~

目录
相关文章
Vue2向Vue3过度核心技术watch侦听器
Vue2向Vue3过度核心技术watch侦听器
53 0
|
6天前
|
JavaScript
vue中watch的用法
vue中watch的用法
|
5天前
|
JavaScript 前端开发
vue学习(15)watch和computed
vue学习(15)watch和computed
17 1
【Vue3】回顾watch,学习watchEffect
【Vue3】回顾watch,学习watchEffect
|
4月前
|
缓存 JavaScript
vue中computed和watch的使用场景
vue中computed和watch的使用场景
|
JavaScript
vue3中watch的用法及讲解
vue3中watch的用法及讲解
|
4月前
|
JavaScript
Vue3的watch使用介绍及场景
Vue3的watch使用介绍及场景
179 0
|
4月前
|
JavaScript
Vue watch详解
当我们在Vue.js中使用watch选项来监听属性时,Vue.js会在内部使用了一个叫做Watcher的类来实现。Watcher类是Vue.js响应式系统的核心之一,它负责建立依赖关系并在依赖发生变化时执行回调函数。 具体来说,当我们使用watch选项定义一个属性的监听器时,Vue.js会创建一个Watcher实例,并将该实例与当前组件实例、属性名以及回调函数进行关联。Watcher实例会负责追踪所监听的属性,并在属性发生变化时触发回调函数。
82 0
|
9月前
【Vue2.0学习】—watch和computed对比(三十七)
【Vue2.0学习】—watch和computed对比(三十七)