Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器

1、computed() 计算属性

在模板中绑定表达式只能用于简单的运算。如果运算比较复杂,可以使用 Vue.js 提供的计算属性,通过计算属性可以处理比较复杂的逻辑。

1.1 计算属性的应用

通过计算属性可以实现各种复杂的逻辑,包括运算、函数调用等,只要最后返回一个计算结果就可以。当计算属性依赖的数据发生变化时,计算属性的值会自动更新,所有依赖该计算属性的数据绑定也会同步进行更新。

【实例】使用 computed 计算属性,实现每个单词首字母大写。

<template><p>原字符串:{{ data }}</p><p>新字符串:{{ newData }}</p>
</template><script setup>
//导入函数
import { ref, computed } from 'vue';//创建一个响应式代理对象
const data = ref('my heart will go on');//计算方法:实现首字母大写
const newData = computed(() => {let arr = data.value.split(' '); //注意:使用响应式对象的.value属性,获取内部值for (let i = 0; i < arr.length; i++) {arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substr(1).toLowerCase();}return arr.join(' ');
});</script>

执行结果:

2.2 计算属性的 getter 和 setter

每一个计算属性都包含一个 getter 和一个 setter。getter 只要用来读取值,而 setter 主要用来设置值。getter 主要用来读取值,而 setter 主要用来设置值。当手动更新计算属性的值时,就会触发 setter,执行一些自定义的操作。

【实例】使用 计算属性的 getter 和 setter,重新设置人物姓名。

<template><p>人物名称:{{ person.fullname }}</p>
</template><script setup>
//导入函数
import { reactive, computed } from 'vue';//创建一个响应式代理对象
const person = reactive({firstName: 'Jim',lastName: 'Carrey'
});// 计算属性 - 简写
// person.fullName = computed(() => {
//   return `${person.firstName} ${person.lastName}`
// })//计算属性的 getter 和 setter
person.fullname = computed({get() {return `${person.firstName} ${person.lastName}`},set(value) {const arr = value.split(' ');person.firstName = arr[0]person.lastName = arr[1]}
});//重新设置人物名称
person.fullname = 'Will Smith';</script>

执行结果:

1.3 methods 与 computed 的区别

问:Vue 中的 methods 方法与 computed 计算属性有什么区别?

答:主要区别是 methods 方法会实时计算,而 computed 计算属性是使用缓存数据。

将相同的操作定义为一个方法,或者定义为一个计算属性,两种方式的结果完全相同。那么为什么还需要计算属性呢?因为计算属性是基于它们的依赖进行缓存的。当页面重新渲染时,如果依赖的数据未发生改变,使用计算属性获取的值就是一直是缓存值。只有依赖的数据发生改变时才会重新获取值。如果使用的是方法,在页面重新渲染时,方法中的函数总会被重新调用。

详情请浏览本博客的文章:《Vue中的methods方法与computed计算属性的区别》

2、watch() 监听器

watch() 方法相当于 Vue 根实例选项对象中的 watch 选项。该方法用于监听特定的数据,并在回调函数中应用。当被监听的数据发生变化时,才会调用回调函数。

2.1 监听 ref 响应式对象

watch() 方法可以接收两个参数。如果使用该方法监听的是一个 ref 对象,那么第一个参数需要监听的 ref 对象,第二个参数是当监听的数据发生变化时触发的回调函数。

【实例】使用 watch() 方法监听一个 ref 响应式对象,实现“米”和“厘米”单元的换算结果。

<template>请输入米数:<input type="text" size="6" v-model="data" /><p>换算结果:{{ result }}</p>
</template><script setup>
//导入函数
import { ref, watch } from 'vue';//创建一个 ref 响应式代理对象
const data = ref(0);//换算结果变量
const result = ref('');//watch监听器
watch(data, (newValue, oldValue) => {console.log("新值", newValue);console.log("旧值", oldValue);result.value = `${data.value} 米 = ${data.value * 100} 厘米`;
});</script>

执行结果:

 

2.2 监听 reactive 响应式对象

如果 watch() 方法监听的是一个 reactive 对象中的某个属性,那么第一个参数需要使用返回该属性的函数的方式。

watch() 方法的两个额外参数:

1、immediate:是否立即执行。

2、deep:是否深度监听。

注意:

如果要监听的属性值是一个对象,要想监听对象内部值的变化,需要在监听属性的选项参数中设置 deep 选项的值为 true(开启深度监听)。

【实例2】使用 watch() 方法监听一个 reactive 响应式对象中的某个属性,输出属性的原值和新值。

<template><p>商品名称:{{ product.name }}</p><p>{{ product.remark }}</p>
</template><script setup>
//导入函数
import { reactive, watch } from 'vue';//创建一个 reactive 响应式代理对象
const product = reactive({name: '华为手机',price: 6999,remark: ''
});//watch监听器
watch(() => product.price, (newValue, oldValue) => {product.remark = `原价格:${oldValue}元,新价格:${newValue}元`;
},//两个额外参数(非必填){immediate: false,  //关闭:立即监听;默认关闭deep: true         //开启:深度监听;如果监听对象是 reactive() 响应式对象,则默认自动开启});//修改属性值
product.price = 3999;</script>

执行结果:

2.3 监听多个属性

监听属性通常用来实现数据之间的换算,如长度单位之间的换算、速度单位之间的换算、汇率之间的换算等。

【实例】使用 watch() 方法监听多个属性,实现速度单位之间的换算。

<template><p><label for="meter">米/秒:</label><input id="meter" type="number" v-model="meter"></p><p><label for="kilometer">千米/小时:</label><input id="kilometer" type="number" v-model="kilometer"></p>{{ meter }}米/秒={{ kilometer }}千米/小时
</template><script setup>
//导入函数
import { ref, watch } from 'vue';//创建两个 ref 响应式代理对象
const meter = ref(0);
const kilometer = ref(0);//watch监听器:监听多个属性
watch([meter, kilometer],([newMeter, newKilometer], [oldMeter, oldKilometer]) => {if (newMeter != oldMeter) {kilometer.value = newMeter * 3600 / 1000;}if (newKilometer != oldKilometer) {meter.value = newKilometer * 1000 / 3600;}}
);</script>

执行结果:

3、watchEffect() 高级监听器

3.1 watchEffect() 的使用

watchEffect() 方法用来监听数据的变化,类似于 Vue 2.x 中的 watch 选项。该方法接收一个函数作为参数,它会立即执行一次,同时会跟踪函数里面用到的所有响应式状态,当状态发生变化时会重新运行该函数。

【实例】使用 watchEffect() 方法监听数据,实现“米”和“厘米”单元的换算结果。

<template>请输入米数:<input type="text" size="6" v-model="data" /><p>换算结果:{{ result }}</p>
</template><script setup>
//导入函数
import { ref, watchEffect } from 'vue';//创建一个 ref 响应式代理对象
const data = ref(0);//换算结果变量
const result = ref('');//watch监听器
watchEffect(() => {result.value = `${data.value} 米 = ${data.value * 100} 厘米`;
});</script>

执行结果:

3.2 watch 和 watchEffect 的区别

watch 和 watchEffect 是 Vue 3.0 中新增的两个响应式 API,用于监听数据的变化。watch 适用于需要获取新值和旧值,或者需要懒执行的场景,而 watchEffect 适用于需要监听多个数据源,并且需要立即执行的场景。它们之间的区别如下:

  1. watch 是监听单个数据源,可以设置 immediate 和 deep 选项,可以获取新值和旧值;watchEffect 则是监听一组数据源,不能设置 immediate 和 deep 选项,不能获取新值和旧值。
  2. watch 是懒执行的,只有在数据变化时才会执行回调函数,而 watchEffect 则是立即执行的,不管数据是否变化。
  3. watch 可以监听计算属性,而 watchEffect 不能监听计算属性。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2&#xff1a;进行问题/问题列表处理&#xff08;正则化&#xff0c;分词&#xff09; 1.3功能模块3&#xff1a;处理输入的问题 1.4功能模块4&#xff1a;计算输入问题与问题…

Python | Leetcode Python题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; CONV "0123456789abcdef" class Solution:def toHex(self, num: int) -> str:ans []# 32位2进制数&#xff0c;转换成16进制 -> 4个一组&#xff0c;一共八组for _ in range(8):ans.append(num%16)num // 16if not num:b…

Python实用的27个实例,涵盖从基础到进阶的所有领域!

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和丰富的库支持而受到开发者们的喜爱。以下列出了 27 个实用的 Python 实例&#xff0c;涵盖从基础到进阶的不同领域&#xff0c;帮助你提升编程技能。 1. 打印 "Hello, World!" print("Hello,…

预训练发展

预训练发展 1.ELMo2.GPT3.Bert3.1Ernie-baidu3.2Ernie- Tsinghua 4.GPT25.UNILM6.Transformer-XL & XLNet6.1方案一6.2方案三 7.Roberta8.SpanBert8.1SBO简介&#xff1a; 9.ALBERT9.1方案一9.2方案二9.3方案三 10.T511.GPT312.从"续写"到"回答"12.1SF…

可解释性机器学习中的局部解释

可解释性机器学习可以被分成两大类&#xff0c;第一大类叫做局部的解释&#xff0c;第二大类叫做全局的 解释&#xff0c;如图 1 所示。局部的解释是&#xff0c;比如有一个图像分类器&#xff0c;输入一张图片&#xff0c;它会判断出 是一只猫&#xff0c;机器要回答问题是为什…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#xff0c;拆分的也越来越细&#xff0c;此时就会出现一个服务集…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…

Android源码导入Android Studio

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 需要先把 Android 源码编译一遍 然后执行下面指令就可以导入android源码了 关于 Android 源码编译可以参考这篇文章【LineageOS源码下载和编译&#xf…

【检索快,IEEE独立出版】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024)

大会简介&#xff1a; 2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机科学技术学院、长春理工大学…

蛋白质原子坐标平移、旋转、缩放示例代码

在处理蛋白质结构时,常常需要对原子的坐标进行几何变换,如平移、旋转和缩放。这些变换在模拟、可视化和结构比较中非常有用。 以下是对这些操作的介绍以及示例代码。 1. 平移 (Translation) 平移就是将所有原子的坐标沿着某个方向进行移动。平移可以通过向每个原子的坐标加…

解锁4款专业的中英翻译工具,让你畅行双语世界。

中英翻译工具在国际化交流越来越频繁的今天还是起着巨大的作用的&#xff0c;它能够促进很多知识的传播和共享&#xff0c;也能够便利大家的工作&#xff0c;学习和生活。今天我就要跟大家分享4个我一直都在用的中英翻译工具。 1、福昕中英翻译网站 直达&#xff1a;https://f…

LeetCode 第415场周赛个人题解

目录 Q1. 数字小镇中的捣蛋鬼 原题链接 思路分析 AC代码 Q2. 最高乘法得分 原题链接 思路分析 AC代码 Q3. 形成目标字符串需要的最少字符串数 I 原题链接 思路分析 AC代码 Q4. 形成目标字符串需要的最少字符串数 II 原题链接 思路分析 AC代码 Q1. 数字小镇中的捣…

数据库全攻略:从类型到安全与优化

数据库全攻略&#xff1a;从类型到安全与优化 一、数据库类型大观 &#xff08;一&#xff09;关系型数据库 关系型数据库以表格形式存储数据&#xff0c;通过 SQL 语言进行操作&#xff0c;数据之间存在关联关系&#xff0c;适合复杂查询和事务处理。常见的关系型数据库有 …

springboot瑜伽课约课小程序-计算机毕业设计源码87936

摘要 本文详细阐述了一个基于SpringBoot框架的瑜伽课约课小程序的设计与实现过程。随着现代生活节奏的加快&#xff0c;越来越多的人开始关注身心健康&#xff0c;瑜伽作为一种集健身、放松、减压于一体的运动方式&#xff0c;受到了广泛的欢迎。为满足瑜伽爱好者的课程预约和学…

Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux

Ubuntu 22.04.5 LTS (Jammy Jellyfish) - 现代化的企业与开源 Linux Ubuntu 22.04.5 发布&#xff0c;配备 Linux 内核 6.8 请访问原文链接&#xff1a;https://sysin.org/blog/ubuntu-2204/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

Recyclerview实现滑动居中缩放菜单

最近项目中需要的一个滑动菜单效果:要求当前居中选项放大、滑动时有缩放效果、点击两边的选项滑动到屏幕中央、停止滑动选项停留在屏幕中间(类似viewPager的效果),为了直观,先上最终实现效果图: 大体思路: Recyclerview item头尾添加空数据,让第一个和最后一个item也能…

c++题目_【模板】最小生成树Prim

题目描述 这是一道最小生成树Prim的模板题&#xff0c;本题与【模板】最小生成树Kruskal&#xff0c;仅仅只有nn和mm的大小不同 给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出orz 输入 第一行输入2个正整数n,mn,m&#xff0c;代表…

数据可视化pyecharts——数据分析(柱状图、折线图、饼图)

安装 首先确保已经安装了pyecharts库&#xff0c;如果没有&#xff0c;可以通过pip install pyecharts进行安装。 柱状图 从pyecharts.charts导入Bar&#xff0c;从pyecharts导入options。准备数据&#xff08;如类别数据x_data和对应的数值数据y_data&#xff09;。创建Bar对…

解决win11 使用wsl工具,不能使用systemctl

使用systemctl命令出现报错&#xff1a; System has not been booted with systemd as init system (PID 1). Can‘t operate. 默认情况下并不启用 systemd&#xff0c;而是使用了其他轻量级的初始化系统&#xff08;SysV init初始化系统&#xff09;。这导致一些需要 system…

力扣最热一百题——螺旋矩阵

目录 题目链接&#xff1a;54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;模拟 1. 边界初始化 2. 循环遍历矩阵 3. 从左到右遍历上边界 4. 从上到下遍历右边界 5. 从右到左遍历下边界 6. 从下到上遍历左边…