Vue3:计算属性、监听器

news2024/11/26 18:29:40

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('');
        
        // 监听表单内容 str
        watch(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.coloradmin.cn/o/651289.html

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

相关文章

软件测试什么样的技术栈才能进入大厂

我们知道&#xff0c;能在一线大厂工作是大多数人的目标&#xff0c;不仅薪酬高&#xff0c;技能提升快&#xff0c;而且能得到公司影响力背书&#xff0c;将来就算跳槽也能带来光环加持。 最近疫情的影响&#xff0c;网上也爆出了一些裁员新闻&#xff0c;可以说这个疫情确实…

【深入浅出密码学】RSA

RSA密码体制 引言&#xff1a; RSA加密的本意并不是为了取代对称密码&#xff0c;而且它比诸如AES的密码要慢很多&#xff0c;因为RSA当中涉及许多数学计算&#xff0c;RSA通常和类似AES的对称密码一起使用&#xff0c;真正用来加密大量数据的是对称密码。而RSA主要保护对称密…

Linux0.11内核源码解析-block_dev.c

目录 block_dev.c 文件的作用 int block_write(int dev, long * pos, char * buf, int count) block_dev.c 文件的作用 block_dev.c 文件的作用 block_dev.c 文件就包含两个函数&#xff0c;分别是block_read和block_write函数&#xff0c;提供给read和write系统调用 块读写…

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)

成立这个专栏的目的是&#xff0c;记录自己嵌入式开发遇到的问题&#xff0c;与成功的解决方法&#xff0c;方便自己回顾。 最近在学习王维波老师的《STM32Cube高效开发教程》&#xff0c;王老师移植的是普中科技的驱动&#xff0c;而我手动移植了一下正点原子的lcd驱动&#…

【Java高级语法】(三)泛型:关于泛型最全面的讲解来了~

Java高级语法详解之泛型 :one: 概念:two: 优势:three: 使用3.1 泛型类3.2 泛型接口3.3 泛型方法 :four: 通配符&#xff08;Wildcards&#xff09;4.1 无界通配符&#xff08;Unbounded Wildcard&#xff09;4.2 上限通配符&#xff08;Upper Bounded Wildcard&#xff09;4.3 …

aardio - 【库】http访问网页

为了简化http访问操作&#xff0c;提高速度&#xff0c;丰富功能&#xff0c;特封装了此库&#xff0c;可以根据需要进行选择。 本库带一个dll&#xff0c;所以建议优先选择使用 inet.http 库&#xff1a; 如果使用 inet.http库&#xff0c;直接 inet.http.get() 速度较慢。 大…

理解3ds max中的容器的概念

实验一&#xff1a; 在场景中创建一个容器 把这个容器保存为一个文件&#xff0c;在文件夹中可看到此容器文件&#xff0c;其大小为892KB&#xff0c;同时可看到生成一个同名的lock类型文件。 将场景中的某一个物体&#xff08;面加多一点的&#xff09;添加到容器中&#x…

框架---面经

Spring 循环依赖 概念 多个实体之间相互依赖并形成闭环的情况就叫做"循环依赖”&#xff0c;也叫做”循环引用。 三级缓存解决循环依赖的原理 循环依赖的解决方案--- Feild注入单例&#xff08;AutoWired&#xff09; 直接在类的成员变量上使用Autowired注解&#xf…

SM2椭圆曲线公钥密码算法

国家密码管理局于2010年12月17日发布了SM2椭圆曲线公钥密码算法&#xff0c;并要求为对现有基于RSA算法的电子认证系统、密钥管理系统、应用系统进行升级改造。关于算法标准&#xff0c;请参见《国家密码管理局公告&#xff08;第 21 号&#xff09;》&#xff0c;网址为​​ht…

JavaWeb【总结】——(请求和响应)浏览器发送请求的方式 服务器响应的方式

本文目录 引出JavaWeb相关知识1.网页状态码web相关背景知识如何在idea中建tomcat web项目2.Web的请求request&#xff1a;get和post&#xff0c;响应response3.同步请求和异步请求Ajax&#xff0c;以及异步的Json响应4.同步jsp和异步ajax的axios下&#xff0c;转发或重定向思考…

【图片轮播】Vue如何实现移动端图片轮播效果,支持左右滑动(附图文及代码)

【写在前面】 日常生活中&#xff0c;其实我们是离不开手机查看相册的&#xff0c;尤其是图片的轮播展示&#xff0c;最近我就接到我家老大给出的需求&#xff0c;首先是从网上下载下来之前她做的图片&#xff0c;然后她就希望能够在自己手机上能随时查看&#xff0c;这不没办法…

Java使用OpenCV进行图像操作

OpenCV图像操作 OpenCV概述下载与安装目录说明项目集成验证 Mat类创建Mat对象其他操作 常见图像API读取与输出图像显示图像图像压缩和解压缩图像转换图像缩放亮度调整图像锐化图像梯度图像二值化边缘检测图像高斯模糊图像反色 OpenCV 概述 OpenCV&#xff08;开源计算机视觉库…

2023互联网高级测试工程师至少具备的能力

业务熟悉 熟悉本系统 测试人员参与测试的系统的各种业务场景&#xff0c;必须做到精熟 。一旦需求有改动&#xff0c;可以清楚快速的知道上下文。同时可以清楚的知道哪些点是需要重点测试的。 熟悉跟本系统有通讯的上下游系统业务 跟本系统有通讯的上下游系统也要非常熟悉。这…

Exception in thread “main“ java.lang.UnsupportedClassVersionError 50报错处理

之间正常走jenkinsdocker自动化部署的项目&#xff0c;今天改了一个文件&#xff0c;点了一下&#xff0c;竟然没有部署上去&#xff0c;提示如上&#xff0c;如下 Exception in thread "main" java.lang.UnsupportedClassVersionError: com/coocaa/tsp/sys/user/Use…

Web 自动化测试Selenium 之PO 模型

目录 1. po 模型介绍 2. PageObject 设计模式 3. PO 的核心要素 4. 非PO 实现 5. PO 实现 6. 总结 7. PO 模式的特点 总结&#xff1a; 1. po 模型介绍 在自动化中&#xff0c;Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同)&#x…

【改进算法】混合鲸鱼WOA和BAT算法(Matlab代码实现)​

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python键盘监听:实现快捷操作和自动化脚本(监听组合键

前言 本文主要介绍一下使用Python进行事件监听功能&#xff0c;以实现一些特有的操作。本文旨在介绍如何实现这一功能。 笔者根据一些需求写了一个小工具&#xff0c;流程和功能如下图所示&#xff08;实际功能有更多&#xff09;&#xff1a; 该工具主要实现了 键盘监听 和 鼠…

从Linux源码看TIME_WAIT状态的持续时间

前言 笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右。线上实际却存在TIME_WAIT超过100s的Socket。由于这牵涉到最近出现的一个复杂Bug的分析。所以&#xff0c;笔者就去Linux源码里面&#xff0c;一探究竟。 首先介绍下Linux环境 TIME_WAIT这个参数通常和五…

C++入门,一些C++基本概念介绍

文章目录 目录 前言 1.C关键字 1.1命名空间 1.2命名空间定义 1.3命名空间的使用 2.C输入&输出 3.缺省参数 3.1缺省参数的概念 3.2缺省参数分类 4.函数重载 4.1函数重载的概念 5.引用 5.1 引用特性 5.2 常引用 5.3引用的使用场景 5.4引用和指针 6.内联函数…

【Java基础】注解——自定义注解

什么是注解? Java 注解(Annotation)又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。 比如我们常见的Override和Deprecated都是注解&#xff0c;注解可以加在类、方法、成员变量等上面&#xff0c;类似于给他们“打标签"。 注解怎么定义? public interface…