Vue3:计算属性、监听器

computed 计算属性

计算属性是指 基于现有状态派生 (演变) 出新的状态,现有状态发生变化,派生状态重新计算。
computed 接收回调函数作为参数,基于回调函数中使用的响应式数据进行计算属性的创建,回调函数的返回值就是基于现有状态演变出的新状态。

// 定义一个数据
const num = ref(0);
// result 通过计算num动态获得
const result = computed(() => num.value * 2);
  • 完整写法
import { ref, computed } from 'vue';export default {setup() {// 响应式数据const firstName = ref('张');const lastName = ref('三');// 计算属性(完整写法,考虑读和写)const fullName = computed({get() {return firstName.value + lastName.value;},set (value) {const nameArr = value.split('-');firstName.value = nameArr[0];lastName.value = nameArr[1];},});// 返回所有的数据和方法,才能使用return { firstName, lastName, fullName }}
}

案例:动态显示名字。

<template><input type="text" v-model="firstName" /><input type="text" v-model="lastName" /><div>姓名:{{ name }}</div>
</template><script>
import { ref, computed } from 'vue';export default {setup() {const firstName = ref('');const lastName = ref('');// 姓名通过计算属性获得const name = computed(() => firstName.value + lastName.value);return { firstName, laseName, name }}
}
</script>

watch 监听状态

watch 方法用于监听响应式数据的变化,数据发生变化时触发。
Vue2 的 watch 是一个配置项,Vue3 的 watch 是一个方法。

# 语法格式
watch([监视对象], fn{监视的回调}, {监视的配置});

监听 ref 的响应式数据

监听 ref 数据时,不能使用 .value,因为监听的是 value 的值,而不是 ref 数据。

  • 监听多个值时,newValue 和 oldValue 会接收一个数组,参数是监听的每一项。

在这里插入图片描述

使用 watch 方法监听基于 ref 创建的响应式数据 (基本数据类型)。

<template><input type="text" v-model="str">
</template><script>
import { ref, watch } from 'vue';export default {setup() {const str ref('');// 监听表单内容 strwatch(str, (newValue, oldValue) => {console.log(newValue, oldValue);}, {// 监听的配置immediate: true,deep: true});// 返回所有的数据和方法,才能使用return { str }}
}
</script>

使用 watch 监听基于 ref 创建的响应式数据 (引用数据类型)。

import { ref, watch } from "vue";export default {setup() {const person = ref({ name: '张三' });// 监听watch(person.value, (newValue, oldValue) => {console.log(newValue, oldValue);}, {// 监听的配置immediate: true,deep: true});// 返回所有的数据和方法,才能使用return { person }},
};

使用 watch 监听响应式数据内部的具体属性 (基本数据类型)

import { ref, watch } from "vue";export default {setup() {const person = ref({ name: '张三' });// 监听watch(() => person.value.name,(newValue, oldValue) => {console.log(newValue, oldValue);});// 返回所有的数据和方法,才能使用return { person }},
};

监听 reactive 的响应式数据

import { ref, watch } from "vue";export default {setup() {const person = reactive({ name: '张三' });// 监听watch(person, (newValue, oldValue) => {console.log(newValue, oldValue);});// 返回所有的数据和方法,才能使用return { person }},
};

监听 reactive 时存在的问题

坑:监听 reactive 时,oldValue 无法正确获取,都是最新值。(Vue3的遗留问题)

  • 解决方案:

watch 的 参数1 使用 () => 对象名.属性名 监听单个属性,但是要使用 deep 深度监听。(虽然麻烦,但是有效)

  const person = ref({ name: '张三', age: 18 });watch(// 参数一写法解决 oldValue 值无法获取[() => person.name, () => person.age],(newValue, oldValue) => {console.log(newValue, oldValue);});

坑:使用 reactive 时,强制开启 deep 深度监视,且 deep 无法被关闭。(Vue3的遗留问题)

在这里插入图片描述

import { ref, watch } from "vue";export default {setup() {const person = reactive({ name: '张三' });// 监听watch(person, (newValue, oldValue) => {console.log(newValue, oldValue);}, {deep: false,   // 无效,无法关闭});// 返回所有的数据和方法,才能使用return { person }},
};

watchEffect 监听状态

watchEffect 函数在页面加载完成后和数据更新时调用。
watch 和 watchEffect 的区别:

  • watch:既要指明监视的属性,也要指明监视的回调。
  • watchEffect:不用指明监视哪个属性,监视的回调中用到哪个属性,就监听哪个属性。

watchEffect 和 computed 的区别:

  • computed 注重计算出来的值(回调函数的返回值),所以必须要写返回值。
  • watchEffect 更注重的是过程(回调函数的函数),所以不用写返回值。
# 语法格式
watchEffect(() => {console.log('watchEffect 函数执行了');
})
<template><h1>{{ person.name }}</h1><button @click="updatePerson">点击更新名字</button>
</template><script>
import { reactive, watchEffect } from "vue";
export default {setup() {// 响应式数据let person = reactive({name: "张三",age: 18,job: {j1: {salary: 20,},},});// 监视watchEffect(() => {console.log("watchEffect执行了");console.log(person.name);});// 更新名字const updatePerson = () => {person.name = "李四";};return { person, updatePerson };},
};
</script>

toRef 函数

创建一个 ref 对象,其 value 值指向另一个对象中的某个属性。
大白话解释:toRef 方法用于将响应式数据内部的普通数据转化为响应式数据,并且转换后的数据和原始数据存在引用关系,存在引用关系意味着当原始数据发生变化后,toRefs 转换后的数据也会跟着变化。
应用:要将响应式对象中的某个属性单独提供给外部使用时。

// 语法
const name = toRef(对象名, '属性名')
<template><h1>{{ name }}</h1><h1>{{ age }}</h1><h1>{{ salary }}</h1>
</template><script>
import { reactive, toRef } from 'vue'
export default {name: 'App',setup() {let person = reactive({name: '张三',age: 18,job: {j1: {salary: 20}}})return {pname: toRef(person, 'name'),age: toRef(person, 'age'),salary: toRef(person.job.j1, 'salary')}},
}
</script>

toRefs 函数

toRefs方法接收引用数据类型的响应式数据,它可以将数据中的第一层属性全部转换为响应式数据,返回值是一个对象,对象中存储了所有转换之后的响应式数据。

export default {setup() {const person = reactive({name: "张三",brand: {title: "宝马",year: 1}});return {...toRefs(person),...toRefs(person.brand)	// 转换第二层数据为响应式}}
}

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

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

相关文章

C/C++内存管理

Lesson5–C/C内存管理 【本节目标】 1.C/C内存分布 2.C语言中动态内存管理方式 3.C中动态内存管理方式 4.operator new与operator delete函数 5.new和delete的实现原理 6.定位new表达式 7.常见面试题 C/C内存分布 先看一段C语言代码和相关问题 int globalVar 1; static in…

Spring Boot 如何使用 Log4j2 进行日志记录

Spring Boot 如何使用 Log4j2 进行日志记录 在开发 Java 应用程序时&#xff0c;日志记录是非常重要的一环。Spring Boot 提供了多种日志输出方式&#xff0c;其中 Log4j2 是一种比较常用的日志框架。本文将介绍如何在 Spring Boot 应用程序中使用 Log4j2 进行日志记录。 为什…

解决Tomcat控制台窗口输出乱码问题

由于编码的问题&#xff0c;tomcat的控制台窗口输出的都是中文乱码&#xff0c;这明显是编码格式导致的&#xff0c;只要找到对应的编码格式修改一下就好了&#xff0c; 由于我的服务器编码是GBK&#xff0c;所有只需把输出的编码修改为GBK就行了。 936就是GBK编码。找到tomca…

相机去畸变

1. 背景 在做图像感知工作过程中会遇到需要处理相机畸变的情况&#xff0c;如SLAM、3D重建等&#xff0c;则需要了解一些常见相机模型的成像过程&#xff0c;以及依据成像过程实现去除相机成像的畸变。 注意&#xff1a;这篇文章并不涉及太多相机参数畸变原理&#xff0c;更多…

使用亮数据Bright Data解决出境电商问题

目录 一、出境电商的困境和问题1、困境一&#xff1a;获取准确的市场数据&#xff08;1&#xff09;数据的时效性和可靠性&#xff08;2&#xff09;数据的全面性和多样性&#xff08;3&#xff09;数据的实时更新和持续监测 2、困境二&#xff1a;克服地域限制和语言障碍&…

我准备蓝桥杯的这一年

我准备蓝桥杯的这一年 文章目录 我准备蓝桥杯的这一年起步和目标确定渐入佳境焦虑疲惫&#xff0c;一天又一天国赛我来力总结 我将我这段 流水账分为四个阶段。谨以此文&#xff0c;祭奠我这一年来的焦虑、白发~ &#xff0c;最终也取得了预期的成绩。不知未来再看此章会作何感…

PHP 人才信息与招聘系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 人才信息与招聘系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据 库为mysql5.0&#xff0c;使用php语言开发。…

Postman设置断言

目录 前言&#xff1a; 一、断言的定义 二、Postman断言的语法 三、Postman中chai.js断言常用语法 前言&#xff1a; 在进行API测试时&#xff0c;断言是一项重要的功能。它能帮助我们验证接口的响应是否符合预期结果&#xff0c;从而确保API的正确性和可靠性。在Postman中…

科技资讯|苹果新专利曝光:手势增强用户的交互体验

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的最新清单&#xff0c;苹果公司获得了一项编号为 US 20230195237 A1 的专利&#xff0c;展示了使用手势导航用户界面的交互体验。 苹果这项专利涉及 iPhone、iPad、Apple Watch 和 Mac&#xff0c;使用屏幕生成组件和…

Itext 7 生成pdf带有背景图

Itext 7 生成pdf带有背景图并下载PDF到本地 引入jar包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.0.3</version><type>pom</type></dependency>代码实现 Get…

来酷智生活,Type-C十二合一扩展坞来了

联想最新推出的“来酷智生活Type-C十二合一扩展坞”为用户带来更多接口选择&#xff0c;方便实用。 这款扩展坞包含12个接口&#xff0c;包括2个USB 3.2&#xff0c;2个USB 2.&#xff0c;2个HDMI接口&#xff0c;TF卡插槽&#xff0c;SD卡插槽&#xff0c;DP接口&#xff0c;P…

十分钟实现 Android Camera2 视频录制

1. 前言 因为工作中要使用Android Camera2 API&#xff0c;但因为Camera2比较复杂&#xff0c;网上资料也比较乱&#xff0c;有一定入门门槛&#xff0c;所以花了几天时间系统研究了下&#xff0c;并在CSDN上记录了下&#xff0c;希望能帮助到更多的小伙伴。 上两篇文章们使用…