【Vue3】学习watch监视:深入了解Vue3响应式系统的核心功能(下)

简介: 【Vue3】学习watch监视:深入了解Vue3响应式系统的核心功能(下)

🍋情况三:监视【reactive】定义的对象类型数据

准备代码如下

<template>
  <div class="person">
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改人</button>
</div>
 </template>
 
 <script lang="ts" setup name="Person11">
    import {reactive,watch} from 'vue'
    let person = reactive({
      name:"馒头",
      age:22
    })
   function changeName(){
    person.name += '*' 
   }
   function changeAge(){
    person.age += 1
   }
   function changePerson(){
    person = {name:'小馒头',age:23}
   }
 </script>
 
 <style scoped>
   .person {
     background-color: skyblue;
     box-shadow: 0 0 10px;
     border-radius: 10px;
     padding: 20px;
   }
   button {
     margin: 0 5px;
   }
 </style>

对于之前的ref,我们清楚的知道它可以对整体对象进行修改,也就是上一节的情况二,但是对于reactive来说,并不可以对整体就行修改,那如果我们想要就行整体修改的话,需要做点小修改

function changePerson(){
    Object.assign(person,{name:'小馒头',age:23}) 
   }

这样相当于默认开启深度监视(不能使用deep关掉),接下来我们将监视代码写上

watch(person,(newValue,oldValue)=>{
    console.log(newValue,oldValue)
   })

这样就可以了

🍋情况四:监视【ref或reactive】定义的对象类型数据中的某个属性

  1. 若该属性值不是【对象类型】,需要写成函数形式。
  2. 若该属性值是依然是【对象类型】,可直接编,也可写成函数,建议写成函数。

结论:监视的要是对象里的属性,那么最好写函数式

注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视。

准备代码如下

<template>
  <div class="person">
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>爱好:{{ person.hobby.h1 }}、{{ person.hobby.h2 }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changeH1">修改第一个爱好</button>
    <button @click="changeH2">修改第二个爱好</button>
    <button @click="changeHobby">修改整个爱好</button>
</div>
 </template>
 
 <script lang="ts" setup name="Person11">
    import {reactive,watch} from 'vue'
    let person = reactive({
      name:'馒头',
      age:22,
      hobby:{
        h1:'游泳',
        h2:'篮球'
      }
    })
    function changeName(){
      person.name += '~'
    }
    function changeAge(){
      person.age += 1
    }
    function changeH1(){
      person.hobby.h1 = '足球'
    }
    function changeH2(){
      person.hobby.h2 = '羽毛球'
    }
    function changeHobby(){
      person.hobby = {h1:'乒乓球',h2:'跳绳'}
    }
 </script>
 
 <style scoped>
   .person {
     background-color: skyblue;
     box-shadow: 0 0 10px;
     border-radius: 10px;
     padding: 20px;
   }
   button {
     margin: 0 5px;
   }
 </style>

我们先来运行一下界面

如果我们想要监控全部

watch(person,(newValue,oldValue)=>{
    console.log(newValue,oldValue)
   })

如果我们想要监视某一个属性可以直接(.)属性么。我们来试试看

watch(person.name,(newValue,oldValue)=>{
    console.log(newValue,oldValue)
   })

结果显然是不可以的

那我们如何修改呢,需要加一个getter函数,所谓getter函数就是能返回一个值的函数

watch(()=>{return person.name},(newValue,oldValue)=>{
    console.log(newValue,oldValue)
   })

这样修改的监视就可以满足对某属性的监视了


如果我们想要监视对象的话,下面的代码就可以解决,但是当我们点击修改对象整体,确不监视了

watch(()=>person.hobby,(newValue,oldValue)=>{
    console.log('person.car变化了',newValue,oldValue)
  })

这时候我们需要加点东西,也就是我们之前说过的deep配置

watch(()=>person.hobby,(newValue,oldValue)=>{
    console.log('person.car变化了',newValue,oldValue)
  },{deep:true})

这样我们就可以全部监视了

注意:监视响应式对象中的某个属性,且该属性是对象类型的,可以直接写,也能写函数,更推荐写函数

🍋情况五:监视上述的多个数据

写法如下,将想要监视的对象或者属性包裹在[ ]中即可

watch([()=>person.name,person.hobby],(newValue,oldValue)=>{
    console.log(newValue,oldValue)
  },{deep:true})

🍋总结

本节将剩下的监视情况全数介绍了,如果有感兴趣的请参考官方文档watch

挑战与创造都是很痛苦的,但是很充实。


相关文章
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
这篇文章通过一个实际的Vue项目案例,演示了如何在Vuex中实现多组件间共享数据。文章内容包括在Vuex的state中新增用户数组,创建Person.vue组件用于展示和添加用户信息,以及在Count组件中使用Person组件操作的数据。通过测试效果展示了组件间数据共享和状态更新的流程。
Vue学习之--------深入理解Vuex之多组件共享数据(2022/9/4)
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
这篇文章详细介绍了Vuex的模块化编码和命名空间的使用,旨在让代码更易于维护并提高数据分类的明确性。内容包括模块化和命名空间的概念、如何在store中配置模块、以及如何在组件中使用模块化的数据。文章通过实战项目案例,展示了如何拆分`store/index.js`文件,创建`count.js`和`person.js`模块,并在`Count.vue`和`Person.vue`组件中使用这些模块。最后,文章还提供了测试效果和一些使用注意点。
Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)
|
1天前
|
JavaScript 前端开发 开发者
Vue学习之--------深入理解Vuex、原理详解、实战应用(2022/9/1)
这篇文章详细介绍了Vuex的基本概念、使用场景、安装配置、基本用法、实际应用案例以及注意事项,通过一个数字累加器的实战示例,帮助开发者深入理解Vuex的原理和应用。
|
1天前
|
JavaScript
Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)
这篇文章深入探讨了Vuex中的getters概念和用法,以及如何通过mapState、mapGetters、mapActions和mapMutations四个辅助函数简化组件中的Vuex状态访问和操作,通过实际项目案例展示了这些概念的应用和效果。
|
9月前
|
缓存 JavaScript
vue中computed和watch的区别
vue中computed和watch的区别
|
缓存 JavaScript
Vue 中 computed 和 watch 的区别
Vue 中 computed 和 watch 的区别
80 0
|
3月前
|
缓存 JavaScript
聊一聊Vue中的computed和watch区别
聊一聊Vue中的computed和watch区别
|
3月前
|
缓存 JavaScript
Vue 中的 computed 和 watch 的区别
Vue 中的 computed 和 watch 的区别
|
9月前
|
缓存 JavaScript 前端开发
Vue 中的 computed 和 watch 的区别
Vue 中的 computed 和 watch 的区别
101 0
|
缓存 JavaScript
Vue中computed和watch的区别
1、支持缓存,只有依赖数据发生改变,才会重新进行计算 2、不支持异步,当computed内有异步操作时无效,无法监听数据的变化
154 0
Vue中computed和watch的区别