Vue3中watch的value问题

news/2024/11/20 23:31:43/

目录

  • 前言
  • 一,ref和reactive的简单复习
    • 1.ref函数
    • 1.2 reactive函数
    • 1.3 用ref定义对象类型数据不用reactive
  • 二,watch的value问题
    • 2.1 ref
      • 2.1.1 普通类型数据
      • 2.1.2 对象类型数据
      • 2.1.3 另一种方式
    • 2.2 reactive
  • 三,总结
  • 后记

前言

在Vue3中,定义响应式数据有两种方式,第一种是ref,第二种是reactive。在使用监视属性的时候,我们可能会监视普通类型的数据(也就是ref定义的),也可能会监视对象或者数组类型的数据。(也就是reactive定义的,当然也可以是ref定义的)

之前在Vue2与Vue3响应式的详解与对比博客中介绍过ref和reactive的用法及区别,以及为什么要用到value。本篇博客在此基础上阐述,watch检测数据的时候,要不要加value的这个问题。

一,ref和reactive的简单复习

这一节是对ref和reactive的简单复习,如果要深层次的学习以及知晓原理可以看上面那一篇链接博客。

1.ref函数

我们先来看一个ref定义的数据答应出来是个什么,见下面代码:

<template><div>学校名称: {{ school }}</div><button @click="school = '家里蹲大学'">修改学校名称</button>
</template><script>
import {ref, reactive, watch} from 'vue'
export default {name: 'App',setup() {let school = ref('湖北师范大学')watch(school, (newValue, oldValue) => {console.log('school被修改');console.log(school)})return {school}}
}
</script>

效果:
在这里插入图片描述
可以看到最后得到的是一个RefImpt:引入对象的实现对象的实例对象,简称引用对象。使用时,模板语法中可以省略value,函数中需要使用value进行修改。

ref实现响应式的原理和Vue2中实现响应式的原理是一样的,都是通过Object.defintProperty来实现的。

1.2 reactive函数

reactive函数用作对象及数组类型的数据。请看以下代码:

<template><div>学校名称:{{ school }}</div><button @click="school = '家里蹲大学'">修改学校名称</button><div>姓名: {{ person.name }}</div><div>工作名称: {{ person.job.type }}</div><div>工作薪水: {{ person.job.salary }}</div><button @click="person.job.salary = '100k'">修改薪水</button>
</template><script>
import { ref, reactive, watch } from 'vue'
export default {name: 'App',setup() {let school = ref('湖北师范大学')let person = reactive({name: '巧克力小猫猿',job: {type: '前端开发工程师',salary: '90k'}})watch(person, (newValue, oldValue) => {console.log('person被更改')console.log(person)})return { school, person }}
}

效果:
在这里插入图片描述
对于用reactive函数定义的对象类型的数据,内部原理是检测Proxy实例对象。所以在书写是时候不需要value,模板语法中也不需要value,并且可以深度监视。

1.3 用ref定义对象类型数据不用reactive

如下面代码:

<template><div>学校名称:{{ school }}</div><button @click="school = '家里蹲大学'">修改学校名称</button><div>姓名: {{ person.name }}</div><div>工作名称: {{ person.job.type }}</div><div>工作薪水: {{ person.job.salary }}</div><button @click="look">点击查看person</button>
</template><script>
import { ref, reactive, watch } from 'vue'
export default {name: 'App',setup() {let school = ref('湖北师范大学')let person = ref({name: '巧克力小猫猿',job: {type: '前端开发工程师',salary: '90k'}})function look() {console.log(person)}return { school, person, look}}
}
</script>

效果如下:
在这里插入图片描述
可以看出,如果ref遇到一个对象类型的数据类型,会求助reactive。因为检测Proxy实例对象,是由reactive来监测到。而reactive是深层次的,所所以能够检测到Proxy内部的内容。

二,watch的value问题

2.1 ref

首先遇到ref,我们脑海中的原则是,模板语法中不用value,js中操作数据需要带上value。

在watch中,先说结论,如果要检测一个普通类型的数据,不需要value。如果检测对象类型的数据需要加value

2.1.1 普通类型数据

先说普通类型数据,我们现在以一个例子来说明,如下代码:

<template><div>违规次数: {{ sum }}</div><button @click="sum++">违规次数加1</button><div>姓名: {{ person.name }}</div><div>工作名称: {{ person.job.type }}</div><div>工作薪水: {{ person.job.salary }}</div><button @click="person.job.salary = '100k'">修改薪水</button>
</template><script>
import { ref, reactive, watch } from 'vue'
export default {name: 'App',setup() {let sum = ref(0)let person = reactive({name: '巧克力小猫猿',job: {type: '前端开发工程师',salary: '90k'}})//监视sumwatch(sum, (newValue, oldValue) => {console.log('sum被检测了')console.log(sum)})return { person, sum}}
}
</script>

我们点击sum按钮后,sum这个引用对象被监测了
在这里插入图片描述
但是如果监测的是sum.value:
在这里插入图片描述
无法正常运行:
在这里插入图片描述
原因:sum加一后值为1,我们监测的是sum的结构,而不是1这个数字。所以,在监视ref定义的普通类型数据时,不用加value。

2.1.2 对象类型数据

再说ref定义的对象类型数据被监视的情况。请看下面代码:

<template><div>违规次数: {{ sum }}</div><button @click="sum++">违规次数加1</button><div>姓名: {{ person.name }}</div><div>工作名称: {{ person.job.type }}</div><div>工作薪水: {{ person.job.salary }}</div><button @click="person.job.salary = '100k'">修改薪水</button>
</template><script>
import { ref, reactive, watch } from 'vue'
export default {name: 'App',setup() {let sum = ref(0)let person = ref({name: '巧克力小猫猿',job: {type: '前端开发工程师',salary: '90k'}})//监视sum// watch(sum.value, (newValue, oldValue) => {//     console.log('sum被检测了')//     console.log(sum)// })//监视对象类型watch(person, (newValue, oldValue) => {console.log('person被监视')console.log(person)})return { person, sum}}
}
</script>

当我改变薪水时候没办法正常运行。但是一旦我加上value:
在这里插入图片描述
可以正常运行:
在这里插入图片描述
因为对象类型的数据经过ref函数加工会变成引用对象,而该对象的value是Proxy类型的。所以我们如果需要监视Proxy对象中的数据则需要监视的是,person.value的结构。

2.1.3 另一种方式

经过了上面的讲解,应该不难开出,对象类型的数据之所以要加value,是因为我们要监视的是对象中的Proxy对象中的属性。

那我们不妨开启watch的深度监视,同样可以解决问题。
在这里插入图片描述
在这里插入图片描述

2.2 reactive

reactive在监视的时候不需要value。前面复习过,reactive会自动帮我们加上value。并且reactive是深度监视的。它可以窥视对象内部的对象。所以我们只需要监视Proxy对象即可。

三,总结

1.watch中,若监视的是普通类型的数据,不可带value,因为我们检测的是该数据的结构而不是数字。
2.监测ref函数加工的对象时,需要加value,因为使用ref来定义对象,ref是需要求助reactive的,因为reactive可以检测Proxy实例对象,是深层次的。
3.检测ref函数加工的对象还有另一种方法,那就是开启deep的深度监视。
4.监测reactive加工的对象时不需要value,因为reactive是通过Proxy拦截对象中属性的变化。而且reactive的监测是深层次的。

不清楚的小伙伴可以去翻看前面的链接文章,里面有详细的原理讲解。

后记

以上内容,如果存在问题希望读者朋友批评指正!

感谢您的阅读,欢迎关注,后续会带来更多深层次的内容!


http://www.ppmy.cn/news/29431.html

相关文章

用C语言写一个自己的shell-Part Ⅱ--execute commands

Part Ⅱ–execute commands Exec This brings us to the exec family of functions. Namely, it has the following functions: execlexecvexecleexecveexeclpexecvp For our needs,we will use execvp whose signature looks like this int execvp(const char *file, cha…

W25Q256被写保护如何修改

W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到 能够正确的读到ID&#xff0c;但是读到的数据不正确 1.1 打印的寄存器的值 0x2 BUSY &#xff1a;只读&#xff0c; 指令正在执行 WEL (1) &…

【ArcGIS Pro二次开发】(11):面要素的一键拓扑

在工作中&#xff0c;经常需要对要素进行拓扑检查。 在ArcGIS Pro中正常的工作流程是在数据库中【新建要素数据集——新建拓扑——将要素加入拓扑——添加规则——验证】&#xff0c;工作流程不算短&#xff0c;操作起来比较繁琐。 下面以一个例子演示如何在ArcGIS Pro SDK二次…

Spark开发实战-主播打赏排行榜统计

&#xff08;一&#xff09;需求分析 计算每个大区当天金币收入排名前N的主播 背景&#xff1a; 我们有一款直播APP&#xff0c;已经在很多国家上线并运营了一段时间&#xff0c;产品经理希望开发一个功能&#xff0c;计算前N主播排行榜&#xff0c;按天更新排名信息&#xf…

Nodejs模块化

1.模块化 1.1.模块化的基本概念 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分为若干模块的过程。对于整个系统而言&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程中的模块化 编程领域的模块化就是把一个大文件拆成独立并相互依赖的多个小模块…

【2023】某python语言程序设计跟学第二周内容

本文说明&#xff1a; 案例内容为北理工python语言程序设计课程&#xff0c;如有不妥请联系&#xff01; 目录蟒蛇绘制案例&#xff1a;执行结果&#xff1a;代码分析&#xff1a;举一反三&#xff1a;绘制一个五角星图案执行结果&#xff1a;turtle库根据案例简单说明&#xf…

大话数据结构-普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal)

5 最小生成树 构造连通网的最小代价生成树称为最小生成树&#xff0c;即Minimum Cost Spanning Tree&#xff0c;最小生成树通常是基于无向网/有向网构造的。 找连通网的最小生成树&#xff0c;经典的有两种算法&#xff0c;普里姆算法和克鲁斯卡尔算法。 5.1 普里姆&#xff…

计算机网络安全基础知识2:http超文本传输协议,请求request消息的get和post,响应response消息的格式,响应状态码

计算机网络安全基础知识&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤…