Vue3——计算属性和监听

news/2024/12/23 17:19:07/文章来源:https://www.cnblogs.com/wyl-k/p/18624516

一、computed

作用:根据已有的数据计算出新数据,具有缓存性(如果依赖的计算数据不更新就只执行一次,更新再执行)

只读写法:

let fullName = computed(() => {return 计算结果;
})

可读可写:

let fullName = computed({get() {return 计算结果;},set(newVal) {// newVal是触发时传进来的参数...修改数据以达到修改计算属性的效果 }
})

二、watch

作用:监视数据的变化

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

1.ref定义的数据

  情况一:监视【ref】定义的【基本类型】数据

  let sum = ref(0);// 监视 情况一:监视【ref】定义的【基本类型】数据watch(sum, (newVal, oldVal) => {console.log('sum变化了',newVal, oldVal);})

  情况二:监视【ref】定义的【对象类型】数据

  let person = ref({name: '张三',age: 18,})// 监视 此时监视的是对象的地址值,只有对象地址改变时才会触发,如果想监听对象内部属性的变化,需要配置第三个参数对象:deep: true// immediate: true  无论person是否变化,都先执行一次里面的回调函数(第二个参数)watch(person, (newVal, oldVal) => {// 这里的newVal和oldVal值是否一致要看情况,他们指向的地址是person// 如果改变了地址,比如person.value = xxx,就会有不同的newVal和oldVal值,因为指向的地址不是一个// 如果只改变了里面的属性,那newVal和oldVal指向的地址是一个,所以改变后newVal和oldVal都只能查询到最新的值,看起来newVal和oldVal就是一样的console.log('person改变了', newVal, oldVal);}, {deep: true, immediate: true})

  延伸:停止监视写法

  const stopWatch = watch(sum, (newVal, oldVal) => {console.log('sum变化了',newVal, oldVal);if (newVal >= 10) {stopWatch();}})

2.reactive定义的数据

  情况一:监视【reactive】定义的【对象类型】数据(默认开启深度监视,因为reactive的局限性,不能重新分配一个新对象)

  let person = reactive({name: '张三',age: 18,}) // 监视 reactive的响应式数据时默认开启深度监视,且不能通过deep:false来关闭watch(person, (newVal, oldVal) => {console.log('person改变了', newVal, oldVal);})

3.函数返回一个值

  扩展:若是要监听【对象中的某一属性】,可以将这个属性写成【getter函数】(即返回一个值的函数)

  例如:对以下person中的不同属性进行监听

  let person = reactive({name: '张三',age: 18,car: {c1: '奔驰',c2: '宝马'}}) 

  ①若该属性值不是【对象类型】,需要写成函数形式,如下:

  watch(() => person.name, (newVal, oldVal) =>{console.log('person.name发生了变化', newVal, oldVal);})  

  ②若该属性值是【对象类型】,可直接编,也可以写成函数,建议写成函数

    -直接编写,只能监视内部属性的变化,对整个car的修改无法监视,因为person.car指的就是当前的person.car,一旦更改就找不到了

  watch(person.car, (newVal, oldVal) => {console.log('person.car发生了变化', newVal, oldVal);})

    -函数式编写,只能监视person.car地址的变化,无法监视内部属性变化,可以通过配置deep:true解决(同ref监视对象类型一样)

  watch(() => person.car, (newVal, oldVal) => {console.log('person.car发生了变化', newVal, oldVal);}, {deep: true})  

4.一个包含上述内容的数组

  情况一:监听上述多个数据

  let person = reactive({name: '张三',age: 18,car: {c1: '奔驰',c2: '宝马'}})// 监视watch([() => person.name, () => person.car.c1], (newVal, oldVal) => {// newVal和oldVal是name和c1的值console.log('person.car发生了变化', newVal, );}, {deep: true})

三、watchEffect

介绍:立即运行的一个函数(启动即会执行一次),同时响应式地追踪其依赖(可以灵活监控用到的数据),并在依赖更改时重新执行该函数

watch和watchEffect的区别

1.都能监听响应式数据的变化,但是方式不同

2.watch:要明确指出监视的数据

3.watchEffect:不用明确指出监视的数据(函数中用到哪些属性,那就监视哪些属性)

watch和watchEffect分别实现:

  let temp = ref(10);let height = ref(0);
// 通过watch监听实现watch([temp, height], (value) => {const [newTemp, newHeight] = value;if(newTemp >= 60 || newHeight >= 80) {console.log(value);}})// 通过watchEffect监听实现(更方便)watchEffect(() => {/*** 有一个小Bug,一旦temp值大于60之后,再去点击height增加按钮无法输出条件语句内的内容,* 是因为||运算符一旦前面条件满足就不会再执行||后面的语句,因此无法在temp条件满足的情况下去监听height* 解决办法:在watchEffect再使用一下height.value即可监听,或者使用其他运算符*/if (temp.value >= 60 || height.value >= 80) {console.log('达到要求');}})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NAS】绿联NAS+极狐Gitlab+1Panel

1. 准备域名 例如我的 ???.mllt.cc 2. 内网穿透 我使用的Natfrp(https://www.natfrp.com/tunnel/) 创建HTTP隧道(对应端口10080)创建HTTP隧道(对应端口10443) 注意这两隧道要一致,以便绑定同一个域名???.mllt.cc 然后在域名解析那里,将???.mllt.cc解析到隧道地…

static修饰成员方法、static修饰成员的特点总结、浅聊主方法-java se进阶 day01

1.工具类的介绍 工具类不是用于描述事物的类,而是帮我们完成事情的类(打工) 如图当我们编写完这个类后,我们会发现一件事,这个类自己本身并没有意义,这个类完全是给用户进行调用方法的既然是专门给用户调方法,那我们就应该写的更简便点,创建对象,再拿着对象名调用过于…

中考阅读理解深入逻辑分析-003 The Confidence Test 信心测试

文章正文 Mr. Smith stood before his class of 30 students and was going to hand out the final exam papers. "I know how hard you have all worked to get ready for this test," he said. "And because I know you are all able to understand these que…

洞察质量保障:14款测试用例管理工具深度评测,助力软件质量提升

在当今数字化时代,软件的质量关乎着企业的成败。而测试用例管理工具作为保障软件质量的重要利器,其选择的正确与否直接影响到测试工作的效率与效果。在众多的测试用例管理工具中,究竟哪一款才最适合您的项目呢?本文将深入评测 14 款测试用例管理工具,为您在提升软件质量的…

如何选择适合您需求的采集卡

选择采集卡时,需要考虑以下四个因素:1. 内置和外置采集卡选择对于普通的带货直播间来说,外置采集卡就够了。对于一些产品促销或者大型活动直播,可以优先考虑这种更稳定的内置采集卡。如果是做多机位直播,又想省下直播台的钱,可以考虑多路内置采集卡,可以多机位切换。 2.…

X00012-轴承数据集故障诊断的仿真平台完整实现

https://item.taobao.com/item.htm?ft=t&id=725232092864&spm=a21dvs.23580594.0.0.275c2c1bZoUNhN

SM5604勾选的主键和实际主键可能不一致

这是一个bug,看到勾选中是第一行,实际对应的主键可能是第2行。所见不是所得。 勾选的主键与实际的主键不一样。如果不一样,就要把实际的主键设置成一样。$(#btnSCHC,#btnMXCF).click(function () { var $checked = $("td[colname=MC] input[type=checkbox]:checked&q…

sm5604

这是一个bug,看到勾选中是第一行,实际对应的主键可能是第2行。所见不是所得。 勾选的主键与实际的主键不一样。如果不一样,就要把实际的主键设置成一样。$(#btnSCHC,#btnMXCF).click(function () { var $checked = $("td[colname=MC] input[type=checkbox]:checked&q…

小迪安全-基础入门-Web应用蜜罐系统堡垒机运维API内外接口第三方拓展架构部署影响

Web应用&蜜罐系统&堡垒机运维&API内外接口&第三方拓展架构&部署影响知识点: 1、基础入门-Web应用-蜜罐系统 2、基础入门-Web应用-堡垒机运维 3、基础入门-Web应用-内外API接口 4、基础入门-Web应用-第三方拓展架构 一、演示案例-Web-拓展应用-蜜罐-钓鱼诱…

从规划到执行:10款高效项目计划与任务管理软件,助力团队与个人完美协同

在当今快节奏的工作环境中,无论是大型企业团队还是个人创业者,高效的项目计划与任务管理都成为了取得成功的关键因素。随着科技的不断发展,众多项目管理软件应运而生,它们如同得力助手,帮助我们将复杂的项目从规划逐步推进到完美执行,实现团队成员之间以及个人工作流程中…

免费的10款高效项目管理软件——2024年最新选择指南

随着技术的进步,项目管理工具也在不断演变和改进,为团队提供更高效、更具协作性和更加便捷的管理解决方案。在2024年,有许多免费且高效的项目管理软件值得推荐。本文将介绍十款热门的免费项目管理软件,帮助您找到最适合自身需求的工具。一、引言 在当今的商业环境中,高效的…