Vue3的computed计算属性和watch监视(四)

一、computed计算属性

<template><div class="person">姓:<input type="text" v-model="first_name"><br>名:<input type="text" v-model="last_name"><br><button @click="changeFullName">修改全名</button><br><!-- 计算属性的意义在于,full_name可以缓存起来,多次输出的时候,不用计算多次(如果使用函数,则会) -->全名<span>{{full_name}}</span><br>全名<span>{{full_name}}</span><br></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">//1. 首先从vue引入refimport { ref, computed } from 'vue'let first_name = ref('zhang')let last_name = ref('san')// 此时full_name是只读的,并不能修改// let full_name = computed(() => {//     return first_name.value.slice(0, 1).toUpperCase() + first_name.value.slice(1) + '-' + last_name.value// })// 如果full_name想要实现修改功能,需要实现set方法let full_name = computed({get() {return first_name.value.slice(0, 1).toUpperCase() + first_name.value.slice(1) + '-' + last_name.value},//当full_name被修改时,set被调用,且val会捕获到修改后的值set(val) {const [str1, str2] = val.split('-')first_name.value = str1last_name.value = str2}})function changeFullName() {//从这里引用方式(通过value才可以获取该值)可以看出,full_name其实是一个ref对象full_name.value = 'li-si'}</script><style scoped>.person {background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 0 50px;}
</style>

二、watch监视

1、场景一

监视【ref】定义的【基本数据】类型

<template><div class="person"><h1>场景1:监视【ref】定义的【基本数据】类型</h1><br>sum的值: {{sum}}<br><button @click="changeSum">修改sum的值</button><br></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">//1. 首先从vue引入refimport { ref, watch } from 'vue'let sum = ref(0)function changeSum() {sum.value += 1}let stopWatch = watch(sum, (newVal, oldVal) => {console.log('sum值变了', newVal, oldVal)if (newVal > 10) {stopWatch()}})</script><style scoped>.person {background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 0 50px;}
</style>

2、场景二

监视【ref】定义的【对象类型】数据

<template><div class="person"><h1>情况二:监视【ref】定义的【对象类型】数据</h1><br>姓名: {{person.name}}<br>年龄: {{person.age}}<br><button @click="changeName">修改name的值</button><br><button @click="changeAge">修改age的值</button><br><button @click="changePerson">修改person</button><br></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">//1. 首先从vue引入refimport { ref, watch } from 'vue'let person = ref({name: 'Maple',age: 18})function changeName() {person.value.name = 'Max'}function changeAge() {person.value.age = 28}function changePerson() {person.value = { name: 'Kelly', age: 20 }}// 对于对象,watch监视的是对象的地址,所以如果只是对象的属性值(name和age)发生变化,并不会被监视到// 除非手动开启深度监视watch(person, (newVal, oldVal) => {console.log('person值变了', newVal, oldVal)}, { deep: true })</script><style scoped>.person {background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 0 50px;}
</style>

3、场景三

监视【reactive】定义的【对象类型】数据

<template><div class="person"><h1>情况三:监视【reactive】定义的【对象类型】数据</h1><h2>姓名:{{ person.name }}</h2><h2>年龄:{{ person.age }}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="changePerson">修改整个人</button><hr><h2>测试:{{obj.a.b.c}}</h2><button @click="test">修改obj.a.b.c</button></div>
</template><script lang="ts" setup name="Person">import {reactive,watch} from 'vue'// 数据let person = reactive({name:'张三',age:18})let obj = reactive({a:{b:{c:666}}})// 方法function changeName(){person.name += '~'}function changeAge(){person.age += 1}function changePerson(){Object.assign(person,{name:'李四',age:80})}function test(){obj.a.b.c = 888}// 监视,情况三:监视【reactive】定义的【对象类型】数据,且默认是开启深度监视的watch(person,(newValue,oldValue)=>{console.log('person变化了',newValue,oldValue)})watch(obj,(newValue,oldValue)=>{console.log('Obj变化了',newValue,oldValue)})</script><style scoped>.person {background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 0 5px;}li {font-size: 20px;}
</style>

 与场景二不同的是,newVal和oldVal是一样的,表明通过Object.assign重新赋值的时候,并不是生成一个新的对象,而是新的值覆盖了旧值

4、场景四

监视【ref】或者【reactive】定义的【对象类型】数据的某个属性(基本数据类型或者对象类型-都建议写成函数形式)

<template><div class="person"><h1>情况四:监视【ref】或者【reactive】定义的【对象类型】数据的某个属性</h1><br>姓名: {{person.name}}<br>年龄: {{person.age}}<br>家人: {{person.family}}<br><button @click="changeName">修改name的值</button><br><button @click="changeAge">修改age的值</button><br><button @click="changePerson">修改person</button><br><button @click="changePersonFamily">修改person的family</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">//1. 首先从vue引入refimport { reactive, watch } from 'vue'let person = reactive({name: 'Maple',age: 18,family: { 'father': 'David', 'mother': 'Lily' }})function changeName() {person.name = 'Max'}function changeAge() {person.age = 28}function changePersonFamily() {person.family = { 'father': 'Bob', 'mother': 'kathy' }}function changePerson() {Object.assign(person, { 'name': 'Jay', 'age': 30, family: { 'father': 'Bob', 'mother': 'kathy' } })}// 如果要监视某个属性,且该属性是基本数据类型,需要写成函数的形式(因为watch能够监视的对象只能是ref,reactive//、对象或者函数)watch(() => person.name, (newVal, oldVal) => {console.log('person的name值变了', newVal, oldVal)})//person.family虽然是对象数据类型,也要写成函数形式watch(() => person.family, (newVal, oldVal) => {console.log('person的family发生了变换', newVal, oldVal)}, { deep: true })
</script><style scoped>.person {background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 0 50px;}
</style>

5、场景五

监视上述多个数据

<template><div class="person"><h1>情况五:监视上述多个数据</h1><br>姓名: {{person.name}}<br>年龄: {{person.age}}<br>家人: {{person.family}}<br><button @click="changeName">修改name的值</button><br><button @click="changeAge">修改age的值</button><br><button @click="changePerson">修改person</button><br><button @click="changePersonFamily">修改person的family</button></div>
</template><script lang="ts">export default {name: 'Person'}
</script><script setup lang="ts">//1. 首先从vue引入refimport { reactive, watch } from 'vue'let person = reactive({name: 'Maple',age: 18,family: { father: 'David', mother: 'Lily' }})function changeName() {person.name = 'Max'}function changeAge() {person.age = 28}function changePersonFamily() {person.family = { father: 'Bob', mother: 'kathy' }}function changePerson() {Object.assign(person, { 'name': 'Jay', 'age': 30, family: { father: 'Bob', mother: 'kathy' } })}// 如果要监视多个属性,以函数的形式放在数组里watch([() => person.name, () => person.family], (newVal, oldVal) => {console.log('person的name和family值变了', newVal, oldVal)}, { deep: true })</script><style scoped>.person {background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 20px;}button {margin: 0 50px;}
</style>

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

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

相关文章

Linux:Jenkins用户权限和管理

1.下载插件 由于Jenkins的默认权限管理并不是很精细所以我们安装一个插件进行权限的一个管理 插件名称为&#xff1a;Role-based Authorization Strategy 安装完插件我们再去配置一下 进入全局安全配置 选择这个Role-Based Strategy策略然后保存 2.创建角色 我们这里主要使…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

MybatisPlus--03--IService、ServiceImpl

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. IService接口1.1 IService、ServiceImpl 接口的使用第一步&#xff1a;实现basemapper接口第二步&#xff1a;编写service类第三步&#xff1a;编写serviceImpl第…

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本&#xff08;通常命名content.js&#xff09;&#xff0c;在后台脚本&#xff08;通常命名background.js或service-worker.js&#xff09;中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台&#xff0c;执行如下步骤&#xff1a; 访问…

蓝桥杯备赛系列——倒计时50天!

蓝桥杯备赛系列 倒计时50天&#xff01; 前缀和和差分 知识点 **前缀和数组&#xff1a;**假设原数组用a[i]表示&#xff0c;前缀和数组用sum[i]表示&#xff0c;那么sum[i]表示的是原数组前i项之和&#xff0c;注意一般用前缀和数组时&#xff0c;原数组a[i]的有效下标是从…

【Python笔记-设计模式】工厂模式

一、说明 (一) 解决问题 提供了一种方式&#xff0c;在不指定具体类将要创建的情况下&#xff0c;将类的实例化操作延迟到子类中完成。可以实现客户端代码与具体类实现之间的解耦&#xff0c;使得系统更加灵活、可扩展和可维护。 (二) 使用场景 希望复用现有对象来节省系统…

Maven depoly:Skipping artifact deployment

问题描述&#xff1a; 使用IDEA执行mvn depoly将本地开发的模块发布到Maven私服时&#xff0c;一直提示&#xff1a;Skipping artifact deployment&#xff0c;自动跳过了depoly部署阶段。 问题分析 Maven构建生命周期中的每一个阶段都是由对应的maven插件执行具体工作的。既然…

使用IDEA创建spring boot web项目并测试运行

文章目录 准备工作构建项目1、通过Maven Archetype构建一个webapp项目2、添加 Spring Boot 所需依赖3、创建配置文件4、创建启动类5、创建web api 接口6、测试web api接口 准备工作 idea下载地址&#xff1a; https://www.jetbrains.com/idea/download/?sectionwindows java下…

关于torch.cuda.is_available() 返回False 详细说明及解决

一 cuda 环境检测失败 cuda 环境检测代码&#xff1a; import torchprint(torch.__version__) print(torch.cuda.is_available()) print(torch.version.cuda) cuda 环境检测代码执行结果如下图&#xff1a; 关键代码print(torch.cuda.is_available()) 返回 False 通常表示当…

java.lang.IllegalStateException: Promise already completed.

spark submit 提交作业的时候提示Promise already complete 完整日志如下 File "/data5/hadoop/yarn/local/usercache/processuser/appcache/application_1706192609294_136972/container_e41_1706192609294_136972_02_000001/py4j-0.10.6-src.zip/py4j/protocol.py"…

Draw.io绘制UML图教程

一、draw.io介绍 1、draw.io简介 draw.io 是一款强大的免费在线图表绘制工具&#xff0c;支持创建流程图、组织结构图、时序图等多种图表类型。它提供丰富的形状库、强大的文本编辑和样式设置功能&#xff0c;使用户能够轻松创建专业级图表。draw.io 具有用户友好的界面&…

LeetCode 热题 100 | 二叉树(终)

目录 1 二叉树小结 1.1 模式一 1.2 模式二 2 236. 二叉树的最近公共祖先 3 124. 二叉树中的最大路径和 菜鸟做题&#xff08;返校版&#xff09;&#xff0c;语言是 C 1 二叉树小结 菜鸟碎碎念 通过对二叉树的练习&#xff0c;我对 “递归” 有了一些肤浅的理解。…

【激光SLAM】基于滤波的激光SLAM方法(Grid-based)

Filter-based SLAM 贝叶斯滤波数学概念贝叶斯滤波特性贝叶斯滤波的推导 粒子滤波&#xff08;Particle filter&#xff09;特性流程状态传播权重评估重采样算法流程存在的问题 FastSLAM的原理及优化FastSLAM介绍算法流程FastSLAM优化存在的问题及优化进一步优化proposal分布最终…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网&#xff0c;想整理一篇关于RabbitMQ实现RPC调用的博客&#xff0c;打算把两种实现RPC调用的都整理一下&#xff0c;一个是使用官方提供的一个Java cli…

思维模型整合

思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天&#xff0c;每个赛道都有众多可以为客户提供相同价值的对手&#xff0c;而赛道中的佼佼者之所以能打败大部分人&#xff0c;可能并不是他们能比别人更能讨好大众&#xff0c;而是因为在这个赛道它有…

Jmeter学习系列之六:阶梯加压线程组Stepping Thread Group详解

性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:Stepping Thread Group 1、下载配置方法 1.1.下载配置 插件下载地址:…

Selenium定位不到元素怎么办?一定要这么做

在使用Selenium进行自动化测试时&#xff0c;碰到无法定位元素该怎么办&#xff1f;这里总结了9种情况下的元素定位方法&#xff1a; 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位&#xff0c;对于frame/iframe表单内嵌的页面元素无法直接定位。 解决…

Jenkins持续集成Python项目

一、前言   之前学习了很多自动化测试框架&#xff0c;但是写的脚本都是本地执行&#xff0c;多数用来造数据。最近公司掀起一股自动化测试的风&#xff0c;所以就想研究下如何集成jenkins&#xff0c;本次采用pytest&#xff0c;用的是阿里云服务器centos7。 二、服务器环境…

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状&#xff1a;石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下&#xff1a; A > B&#xff1b;B > C&#xff1b;C > A&#xff1b;">"左边一个字母&#xff0c;表示相对优…

bat 查找文件所在

脚本 在批处理文件&#xff08;.bat&#xff09;中查找文件所在的目录&#xff0c;你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例&#xff0c;演示如何在批处理文件中查找指定文件并输出其所在目录&#xff1a; echo off setlocal enabledelayedexpansio…