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

news2024/11/15 19:24:35

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.coloradmin.cn/o/2137945.html

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

相关文章

laravel 查询数据对象转数组

这种的只能转化最外层的$pre_id_arr Db::table(Db::raw("($pre_id_arr_sql) as res"))->get()->toArray();如果需要把里边的都转了需要用下面这个方法 $pre_id_arr Db::table(Db::raw("($pre_id_arr_sql) as res"))->get()->map(function ($…

进程vs线程:高效并发编程的基石

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在数据爆炸和计算需求日益增长的时代&#xff0c;"并发编程"已经不再是一种选择&#xff0c;而是成为了一种"刚需"。随着单核CPU的发展逐渐遇到瓶颈&#xff0c;多核CPU的出现为…

深入理解Java中的线程状态转换及关键同步方法

深入理解Java中的线程状态转换及关键同步方法 在现代软件开发中&#xff0c;多线程编程是实现高效、响应式应用程序的关键技术之一。理解线程的生命周期及其状态转换&#xff0c;对于编写健壮、性能优越的并发程序至关重要。本文将深入探讨Java中线程的各种状态转换&#xff0…

探索信号处理:使用傅里叶小波变换分析和恢复信号

在现代信号处理领域&#xff0c;傅里叶变换是分析和处理信号的一种基本工具。然而&#xff0c;传统的傅里叶变换在处理非平稳信号时存在局限性&#xff0c;因为它无法同时提供时间和频率的信息。为了克服这一挑战&#xff0c;傅里叶小波变换&#xff08;FSWT&#xff09;应运而…

爆改YOLOv8|使用MobileNetV4替换yolov8的Backbone

1&#xff0c;本文介绍 MobileNetV4 是最新的 MobileNet 系列模型&#xff0c;专为移动设备优化。它引入了通用反转瓶颈&#xff08;UIB&#xff09;和 Mobile MQA 注意力机制&#xff0c;提升了推理速度和效率。通过改进的神经网络架构搜索&#xff08;NAS&#xff09;和蒸馏…

java项目之中药实验管理系统(源码+文档)

项目简介 中药实验管理系统实现了以下功能&#xff1a; 中药实验管理系统的主要使用者管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;实验员管理&#xff0c;实验教学管理&#xff0c;在线学习管理&#xff0c;实验信息管理&#xff0c;实验预约…

C++速通LeetCode简单第16题-买卖股票的最佳时机

思路要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益 class Solution { public://要点&#xff1a;假设当天卖&#xff0c;动态更新最低价格和最大利益int maxProfit(vector<int>& prices) {int ans 0;int lowest prices[0];for(int i 1; i &…

bin | hex

hex bin 纯粹的程序数据&#xff0c;不包含&#xff1a;长度、地址、数据等信息 可以直接把数据赋值到单片机程序地址&#xff08;STM32 一般时0x8000 0000&#xff09; 应用场景 远程固件升级 比较 实际文件对比

Mybatis-plus-Generator 3.5.5 自定义模板支持 (DTO/VO 等) 配置

随着项目节奏越来越快&#xff0c;为了减少把时间浪费在新建DTO 、VO 等地方&#xff0c;直接直接基于Mybatis-plus 这颗大树稍微扩展一下&#xff0c;在原来生成PO、 DAO、Service、ServiceImpl、Controller 基础新增。为了解决这个问题&#xff0c;网上找了一堆资料&#xff…

【硬件模块】SHT20温湿度传感器

SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V&#xff0c;推荐是3V&#xff0c;所以如果我们的MCU是5V的&#xff0c;那么就得转个电压才能用了。 IIC常见的速率有100k&#xff0c;400k&#xff0c;而SHT20是支持400k的&#xff08…

Parallels Desktop 20破解版(Mac虚拟机) v20.0.0 for Mac 最新商业版(支持M系列)

Parallels Desktop 20是一款目前功能最强大灵活度最高的虚拟机软件&#xff0c;可运行数千种 Windows 应用程序&#xff0c;如 Microsoft Office、Internet Explorer、Access、Quicken、QuickBooks、Visual Studio&#xff0c;甚至支持对图像要求较高的游戏和 CAD 项目&#xf…

[产品管理-17]:NPDP新产品开发 - 15 - 产品设计与开发工具 - 工欲善其事,必先利其器 - 创意工具:借助各种工具和方法,完成产品的创意

目录 前言&#xff1a; 一、创意&#xff08;用户问题 -》产品想法&#xff09;的生成 1.1 创意 1.2 先发散后收敛 1.3 创意工具集 二、创意工具概述 2.1 SCAMPER - 按照数据处理逻辑运算的方式发散 SCAMPER创意工具详解&#xff1a;对数据/产品的各种运算、变换&…

如何用SQL Server和Oracle进行数据同步?

数据同步是大数据应用中非常重要的环节&#xff0c;它可以保证数据的实时性和一致性&#xff0c;为数据分析和决策提供重要依据。常见的数据同步方式包括ETL实时同步和实时ETL工具&#xff0c;其中实时ETL工具又可以分为基于日志追踪和基于触发器两种。 针对不同的数据库系统&…

Hqst 品牌 H81801D 千兆 DIP 网络变压器在光猫收发器机顶盒中的应用

Hqst 牌 H81801D 千兆 DIP 网络变压器在光猫收发器机顶盒中的应用主要包括以下几个方面&#xff1a; 1. 信号匹配和转换&#xff1a; H81801D 网络变压器能够匹配光猫收发器与以太网电缆之间的阻抗差&#xff0c;确保信号在传输过程中的完整性&#xff0c;同时它还能将光信号转…

量化交易backtrader实践(一)_数据获取篇(3)_爬取数据

这一节实践其实是在上一节之前进行的&#xff0c;背景原因是因为tushare.pro的积分不够高&#xff0c;当时还没有接触到使用akshare等其他接口&#xff0c;因此对于全股票列表用的是去网页上爬的方式获得的&#xff0c;也就借此机会&#xff0c;再复习了一遍爬虫的相关知识。 …

WPS生成目录

导航窗格&#xff1a;视图->导航窗格 可修改标题的样式&#xff0c;之后的标题直接套用即可 修改其他标题样式也是这样 添加编号&#xff1a;可以选上面的模版 也可自定义编号 生成目录&#xff1a;引用->目录->选用一个 但是我想把目录插到另一页 当我添加几个标题…

IDEA-调用Restful接口

告别Swagger3/Apifox/Postman Swagger3&#xff08;丝袜哥&#xff09; 地址&#xff1a;REST API Documentation Tool | Swagger UI简介&#xff1a;在java代码里面增加注解生成接口文档 在代码里面增加注解 RestController RequestMapping("api/v1/user") Api(ta…

移动UI案例:工具类app整套案例

工具类App是指提供各种实用工具和功能的手机应用程序。这些工具可以包括但不限于日历、闹钟、备忘录、翻译、计算器、单位转换、天气预报、地图导航、音乐播放器、相机、视频编辑等。这些工具类App能够帮助用户解决日常生活和工作中的各种问题&#xff0c;提高效率和便利性。 …

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#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…