Vue3---基础5(computed和watch、watchEffect)

2024-04-12 23:28

本文主要是介绍Vue3---基础5(computed和watch、watchEffect),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

computed 计算属性

        代码示例

<template><div class="person"><div>姓:<input type="text" v-model="firstName"></div><div>名:<input type="text" v-model="lastName"></div><button @click="hChangeName">修改名字</button><div>全名:{{ fullName }}</div></div>
</template><script lang="ts">
// 引入
import { ref, computed } from 'vue';
</script><script lang="ts" setup>
// 定义的数据
let firstName = ref('张')
let lastName = ref('杰')// 此为 只读 的计算属性
// let fullName = computed(() => {
//     return firstName.value.slice(0,1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value
// })// 此为 可读可写 的计算属性
let fullName = computed({get(){return firstName.value.slice(0,1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value},set(val){// console.log('val', val);const [str1, str2] = val.split('-')firstName.value = str1lastName.value = str2}
})function hChangeName(){fullName.value = 'Jason-Zhang'
}
</script>

watch 监听

        作用:监视数据的变化( 和Vue2中的watch作用一致 )

        特点:Vue3 中的 watch 只能监视一下四种数据        

        1. ref 定义的数据

        2. reactive 定义的数据

        3. 函数返回一个值(getter函数)

        4. 一个包含上述内容的数组

        我们在 Vue3 中使用 watch 的时候,通常会遇到以下几种情况

情况一  ref定义的基本类型

        监视 ref 定义的 基本类型数据:直接写数据名即可,监视的是其 value 值的改变

<template><div class="person"><h1>情况一:监视【ref】定义的【基本类型】数据</h1><h2>当前求和为: {{ sum }}</h2><button @click="hChangeSum">+1</button></div>
</template><script lang="ts" setup name="text2">import { ref,watch} from 'vue';// 数据let sum = ref(0)// 方法function hChangeSum(){sum.value += 1}// 监视 情况一:监视【ref】定义的【基本类型】数据// watch(监视对象, 回调函数)const stopWatch = watch(sum, (newVal, oldVal) => {console.log("sum值变化",newVal, oldVal);// 在特定情况下停止监视if(newVal >= 10) {stopWatch()}})
</script>

情况二  ref定义的对象类型

        监视 ref 定义的 对象类型 数据:直接写数据名,监视的是对象的 地址值,若想监视对象内部的数据,要手动开启深度监听

注意:

        若修改的是 ref 定义的对象中的属性newValue 和 oldValue 都是新值,因为它们是同一个对象

        若修改整个 ref 定义的对象,newValue 是新值,oldValue 是旧值,因为不是同一个对象了

<template><div class="person"><h1>情况二:监视【ref】定义的【对象类型】数据</h1><h2>姓名:{{ person.name }}</h2><h2>年龄:{{ person.age }}</h2><button @click="hChangeName">修改名字</button><button @click="hChangeAge">修改年龄</button><button @click="hChangePerson">修改整个人</button></div>
</template><script lang="ts" setup name="text2">import { ref,watch} from 'vue';//          二// 数据let person = ref({name:'张杰',age:22,})// 方法function hChangeName(){person.value.name += '~'}function hChangeAge(){person.value.age += 1}function hChangePerson(){person.value = {name: 'Jason', age: 27}}/* 监视 情况二-1:监视【ref】定义的【基本类型】数据,想监视对象内部属性的变化,需要手动开启(深度监听)watch的第一个参数是:被监视的对象watch的第二个参数是:监视的回调watch的第三个参数是:配置对象(deep 深度监听, immediate 立即监听,等等)*/watch(person, (newVal, oldVal) =>{console.log("person值变化",newVal, oldVal);},{deep:true, immediate:true})</script>

情况三  reactive定义的对象类型

        监视 reactive 定义的【对象类型】数据,且默认开启了深度监听

<template><div class="person"><h1>情况三:监视【ref】定义的【对象类型】数据</h1><h2>姓名:{{ person.name }}</h2><h2>年龄:{{ person.age }}</h2><button @click="hChangeName">修改名字</button><button @click="hChangeAge">修改年龄</button><button @click="hChangePerson">修改整个人</button></div>
</template><script lang="ts" setup name="text2">import { reactive,watch} from 'vue';//          三// 数据let person = reactive({name:'张杰',age:22,})// 方法function hChangeName(){person.name += '~'}function hChangeAge(){person.age += 1}function hChangePerson(){Object.assign(person, {name:'Jason Zhang', age: 27})}// 监视 情况三:监视【ref】定义的【对象类型】数据 默认开启深度监听// 可以通过 deep:false 去关闭watch(person, (newVal, oldVal) =>{console.log("person值变化",newVal, oldVal);})</script>

情况四   ref或reactive定义的对象类型中某个属性

        监视 ref 或 reactive 定义的【对象类型】数据中的某个属性

注意点:

        1. 若该属性值不是【对象类型】,需要写成函数形式;

        2. 若该属性值依然是【对象类型】,可直接编,也可写成函数,建议写成函数;

<template><div class="person"><h1>情况四:监视【ref】或【reactive】定义的【对象类型】数据中的某个属性</h1><h2>姓名:{{ person.name }}</h2><h2>年龄:{{ person.age }}</h2><h2>汽车:{{ person.car.c1 }}、{{ person.car.c2 }}</h2><button @click="hChangeName">修改名字</button><button @click="hChangeAge">修改年龄</button><button @click="hChangeCar1">修改第一台车</button><button @click="hChangeCar2">修改第二台车</button><button @click="hChangeAllCar">修改整个车</button></div>
</template><script lang="ts" setup name="text2">import { reactive,watch} from 'vue';//          四// 数据let person = reactive({name:'张杰',age:22,car:{c1:'小米su7',c2:'保时捷',}})// 方法function hChangeName(){person.name += '~'}function hChangeAge(){person.age += 1}function hChangeCar1(){person.car.c1 = '小米SU35'}function hChangeCar2(){person.car.c2 = '劳斯莱斯'}function hChangeAllCar(){person.car = {c1: '问界M7', c2: '问界M9', }}// 监视 情况四:监视【ref】或【reactive】定义的【对象类型】数据中的某个属性,要写成函数式watch(()=>person.name, (newVal, oldVal) =>{console.log("person.name值变化",newVal, oldVal);})/* 如果直接写,整体car的改变无法监听到如果写成函数式,无法检测对象内的变化此时加上 deep:true 就可以都检测到*/watch(()=>person.car, (newVal, oldVal) =>{console.log("person.name值变化",newVal, oldVal);},{deep:true})</script>

情况五  监视上述多个数据

// 监视 情况五:监视上述多个数据
watch([()=>person.name,()=>person.car.c1], (newVal, oldVal) =>{console.log("person.name值变化",newVal, oldVal);
})

watchEffect  监听

        官网:立即运行一个函数,同时响应式的追踪其依赖,并在依赖更改时重新执行该函数

watch 对比 watchEffect

        1. 都能监听响应式数据的变化,不同的是监听数据变化的方法不同

        2. watch:要明确指出监视的数据

        3. watchEffect:不用明确指出监视的数据(函数中用到哪些属性,就监视哪些属性)

<template><div class="person"><h2>当水温达到60度时,或水位到达80cm时,给服务器发请求</h2><h2>当前水温:{{ temp }}℃</h2><h2>当前水位:{{ height }}cm</h2><button @click="hChangeTemp">水温+10</button><button @click="hChangeHeight">水位+10</button></div>
</template><script lang="ts" setup name="text2">import { ref,watch, watchEffect} from 'vue';// 数据let temp = ref(10)let height = ref(5)// 方法function hChangeTemp(){temp.value += 10}function hChangeHeight(){height.value += 10}// 监视 ------ watch 实现// watch([temp,height], (value) =>{//     // 从value 中获取最新的水温和水位//     let [newTemp, newheight] = value//     // 逻辑//     if(newTemp >=60 || newheight >= 80) {//         console.log('发请求');//     }// })// 监视 ------ watchEffect 实现watchEffect(() => {// 逻辑if(temp.value >=60 || height.value >= 80) {console.log('发请求');}})</script>

 

这篇关于Vue3---基础5(computed和watch、watchEffect)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898528

相关文章

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列