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('');
        
        // 监听表单内容 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)	// 转换第二层数据为响应式
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

壳牌小程序笔记

壳牌加油站 uni-app-基础-day01 概览 为什么要学uni-app&#xff1f; 现在很多中小型公司&#xff0c;都有自己的小程序项目&#xff0c;然后开发小程序就会用到uni-app。 uni-app没有诞生之前&#xff0c;怎么写小程序 使用原生微信小程序这个框架去开发&#xff1f; 只…

解析vcruntime140.dll文件,缺失了要怎么去修复?

在计算机的世界中&#xff0c;vcruntime140.dll是一个重要的动态链接库文件。然而&#xff0c;有时候这个文件可能会引发一系列问题&#xff0c;影响应用程序的正常运行。如果你缺少了vcruntime140.dll&#xff0c;那么你的程序就会打不开&#xff0c;今天我们一起来聊聊vcrunt…

鸟类识别Python,基于TensorFlow卷积神经网络【实战项目】

一、介绍 鸟类识别系统&#xff0c;使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0c;…

Linux Ubuntu man文档的图文安装教程

文章目录 前言man文档的起源man文档的安装man文档的使用总结 前言 当提及"man文档"时&#xff0c;通常是指Unix和类Unix系统中的手册页&#xff08;man page&#xff09;&#xff0c;因为Linux是在Unix的基础上发展而来的操作系统&#xff0c;所以我们的Linux也有ma…

IIS安装localhost显示下载,urlrewrite设置

1.取消ftp服务勾选 2. ping localhost ping 127.0.0.1 如果显示 &#xff1a;&#xff1a;1 则需要禁用ipv6 在注册表 找到并单击下面的注册表子项&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 双击“DisabledComponents”以修…

【机器学习】sklearn数据集的使用,数据集的获取和划分

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 sklearn数据集 二、安装sklearn二、获取数据集三、…

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法&#xff0c;通过记录读卡器或智能手机打开时的电源 LED&#xff0c;使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知&#xff0c;这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

STC单片机存储器介绍和使用

STC单片机存储器介绍和使用 🌿STC15F2K60S2系列内部结构框图 🌿STC12C5A60S2系列内部结构框图 📑程序存储器(ROM/Flash) 🔖STC单片机ROM容量大小可以根据其型号和命名规则了解到。 🌿STC15

WiSA Technologies开始接受WiSA E多声道音频开发套件的预订

美国俄勒冈州比弗顿市 — 2023年6月13日 — 为智能设备和下一代家庭娱乐系统提供沉浸式无线声效技术的领先供应商WiSA Technologies股份有限公司&#xff08;NASDAQ股票代码&#xff1a;WISA&#xff09;宣布&#xff1a;该公司现在正在接受其WiSA E开发套件的预订。WiSA E使用…

【深度学习】6-1 卷积神经网络 - 卷积层

卷积神经网络(Convolutional Neural Network&#xff0c;CNN)。 CNN 被用于图像识别、语音识别等各种场合&#xff0c;在图像识别的比赛中&#xff0c;基于深度学习的方法几乎都以 CNN 为基础。 首先&#xff0c;来看一下 CNN 的网络结构&#xff0c;了解 CNN 的大致框架。CNN…

macOS编译开源全景拼接库OpenPano

1. 准备工具 clang与cmake 如果要处理png文件要下载安装libjpeg 安装相当依赖: brew install gnu-sed brew install libjpeg brew install eigen brew install libomp2.克隆源码 git clone --recursive https://github.com/ppwwyyxx/OpenPano.git 3.编译 mkdir build cd …

力扣 404. 左叶子之和

题目来源&#xff1a;https://leetcode.cn/problems/sum-of-left-leaves/description/ C题解1&#xff1a;递归法&#xff0c;前序遍历。 1. 确定输入参数&#xff1a;当前节点&#xff0c;左叶子的和&#xff1b; 2. 确定终止条件&#xff1a;空节点时返回&#xff1b; 3. …

Java的Stream流详细讲解

一.Stream 是什么 Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响。 ​ 同时stream不是一种数据结构&#xff0c;它只是某种数据源的一个视图&…

用Python写了一个下载网站所有内容的软件,可见即可下

目录标题 前言效果展示环境介绍:代码实战获取数据获取视频采集弹幕采集评论 GUI部分尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI&#xff0c;把这些功能放到一起让朋友用起来更方便~ 效果…

Debezium系列之:深入理解tinyint(n)

Debezium系列之:深入理解tinyint 一、背景二、相关技术博客三、查看表的ddl四、深入理解tinyint(n)五、创建表六、插入数据七、查看topic数据八、总结一、背景 数据库修改了字段类型为tinyint,希望采集的时候能够转化为boolean类型,数据库字段类型如下图所示: 在设置了conv…

new Vue后整个的流程

文章目录 new Vue后整个的流程Vue.js 创建应用程序流程概述使用 new Vue() 创建Vue 实例流程概述 new Vue后整个的流程 new Vue({el: #app,render: h > h(App),data() {return {message: hello vue}} }).$mount(#app)Vue.js 创建应用程序流程概述 在使用 Vue.js 创建一个应…

8.OpenCV-识别身份证号码(Python)

需求描述&#xff1a; 通过OpenCV识别身份证照片上的身份证号码&#xff08;仅识别身份证号码&#xff09; 实现思路&#xff1a; 1.将身份证号中的0,1,2,3,4,5,6,7,8,9作为模板&#xff0c;与身份证照片中的身份证号码区域进行模板匹配。 2.先要制作一个身份证号码模板&am…

RabbitMQ Exchange类型和工作模式介绍

RabbitMQ Exchange类型和工作模式介绍 一RabbitMQ Exchange类型1.1.Fanout1.2.Direct1.3.Topic1.4.Headers 二 RabbitMQ 工作模式介绍2.1.work工作模式(资源的竞争)2.2.publish/subscribe发布订阅(共享资源)2.3.routing路由模式应用--direct交换器 2.4.topic 主题模式(路由模式…

CSDN个性化推荐系统-负反馈测试

文章目录 前言一、uc不感兴趣标签过滤测试1.uc不感兴趣标签获取(uc_unlike_tag_list)1.1个人中心界面1.2从标签中可以发现什么&#xff1f;1.3与研发确认点1.4设计开发1.5接口获取结果 2.推荐流文章标签获取(tag_list)2.1部分代码2.2基本标签校验2.3基本标签校验结果 3.推荐流u…

华为云专家出品《深入理解边缘计算》电子书上线

华为开发者大会PaaS生态电子书推荐&#xff0c;助你成为了不起的开发者&#xff01; 什么是边缘计算&#xff1f;边缘计算的应用场景有哪些&#xff1f; 华为云出品《深入理解边缘计算》电子书上线 带你系统理解云、边、端协同的相关原理 了解开源项目的源码分析流程 学成能…