前端系列-9 Vue3生命周期和computed和watch

背景

本文介绍Vue3的生命周期和钩子函数,鉴于篇幅允许以及防止前端文章过于分散,因此将watch和computed部分之前的学习笔记也整理到本文中。这三部分是三个知识点。watch可以与pinia的$subscribe状态监听进行比较学习。

1.组件生命周期

vue的每个组件的生命周期都可以分为四个阶段:创建、挂载、更新、销毁;每个阶段的前后都提供了钩子函数,让开发者有机会在特定阶段运行自己的代码。这些钩子函数叫做生命周期钩子。
[1] setup : 最早执行的钩子函数, 在创建组件之前执行;
[2] onBeforeMount和onMounted:组件挂载前后之前的函数;
[3] onBeforeUpdate和onUpdated:组件更新前后执行的函数;
[4] onBeforeUnmount和onUnmounted:组件卸载前后执行的函数;
具体使用方式如下所示:

<template><div><p>{{ num }}</p><button @click="addNum">addNumBtn</button></div>
</template><script lang="ts" setup>import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'console.log('setup')let num = ref(0)function addNum() {num.value += 1}onBeforeMount(()=>{console.log('before mount')})onMounted(()=>{console.log('after mount')})onBeforeUpdate(()=>{console.log('before update')})onUpdated(()=>{console.log('after update')})onBeforeUnmount(()=>{console.log('before unmounted')})onUnmounted(()=>{console.log('after unmounted')})
</script>

组件加载后,Console控制台显示如下:

setup
before mount
after mount

当点击addNumBtn时,当前组件发生变化,触发更新事件,Console控制台显示如下:

before update
after update

说明:以onBeforeMount为例进行说明,在setup中执行onBeforeMount(函数参数),表示注册该组件在挂载前执行的方法,函数参数实际的执行时机为组件挂载前。VUE在生成和挂载组件时,按照深度优先的策略进行,子节点挂载完成后,才挂载父节点,即服务启动后,App.vue是最后一个挂载的组件。

2.computed

computed是vue3提供的响应式计算属性,可以根据其他响应式数据的变化而自动更新自身的值,并渲染到组件上。通过使用getter函数和setter函数来实现,访问计算属性时会调用getter计算并缓存计算结果;当依赖的响应式数据发生变化事,会再次调用getter计算并缓存新的计算结果;当修改计算属性时,调用setter函数进行更新。

说明: computed使用缓存是为了减少计算次数以提高性能;只有数据发生才会重新计算

以下通过案例进行介绍:

<script setup lang="ts">
import {ref, computed} from 'vue'let num = ref(0);// 在computed内部函数中定义计算逻辑
let computedNum = computed(  ()=>{return num.value * 100;}  )function changeNum(){num.value++;
}
</script><template><div><div>{{num}}</div><div>{{computedNum}}</div><hr><div @click="changeNum">修改按钮</div></div>  
</template><style lang= "scss" scoped>
</style>

在页面上,点击修改按钮时,num和computedNum在页面上发送变化。
如果新增一个按钮用于修改computedNum的值并触发修改,此时页面不会发生变化,浏览器控制台告警显示:[Vue warn] Write operation failed: computed value is readonly.即上述给computed传递一个函数的语法定义的计算属性为只读(不可写)。
如要求computed计算属性支持可读写,需要按如下方式修改:

// 只读
let computedNum = computed(  ()=>{return num.value * 100;}  )// 可读可写
let computedSetNum = computed({get(){return num.value * 123;},set(value) {num.value=value;}});

说明:computed传递一个对象,对象包含了get()和set(value)方法,分别用于读数据和写数据时调用。

3.watch

在“前端系列-8 集中式状态管理工具pinia”中介绍过可以通过store对象的$subscribe监听状态的变化,一般用于全局变量,而组件内部的变量可用watch实现监听。
watch一般用于监听ref和reactive包装的响应式对象,以及它们构成的数组。在不同场景下,watch使用方式有所区别,以下结合案例分章节分别进行介绍。

3.1 ref基本变量

监听基本变量

const num = ref(0)watch(num, (newValue, oldValue) => {console.log('num updated', newValue)
})

在setup中直接调用watch方法进行注册监听,同时传递两个参数: [1]要监听的变量和[2]处理函数。其中, 处理函数有两个入参,分别表示更新后的值和更新前的值;当监听的变量发生变化时,处理函数会被调用。

3.2 ref 对象变量

ref对象被watch时,需要多传入一个配置对象,用于指定深度递归;否则监听的是ref对象的地址,即ref属性发生变化时,watch监听不会被触发。正确的使用方式如下:

const person = ref({name: 'ewen',age: '19',address: {country: 'CN',area: 'NanJing'}
})watch(person, (newValue, oldValue) => {console.log('person update', newValue)
},  { deep: true } )

{ deep: true }对象deep表示是否进行深度递归,即子孙属性变化时,是否触发watch监听。
初次之外,还可以配置 immediate项,true表示立即触发(创建watch监听时触发,旧值为空),false表示第一次更新时触发。

3.3 reactive对象变量

3.3.1 监听整个变量

const person = reactive({name: 'ewen',age: '19',address: {country: 'CN',area: 'NanJing'}
})watch(person, (newValue, oldValue) => {console.log('person update', newValue)
})

当person的属性(含属性的子属性…)有变化时,都会触发watch监听。

3.3.2 监听变量的某个属性

// 监听整个person对象
watch(person, (newValue, oldValue) => {...}
// 等价于 watch(() => person, (newValue, oldValue) => {...}// 监听person对象的某个属性
watch( () => person.name, (newValue, oldValue) => {...}

3.4 组合监听

当多个ref对象、reactive对象变化时触发相同的逻辑(如打印日志),可以分别定义watch监听;也可对这些对象进行组合监听。将前面的变量修改为数组即可,如下所示:

// 使用时注意监听变量和参数的对应顺序
watch([() => num, person.name], ([newNum, newPerson], [oldNum, oldPerson]) => {console.log('data updated')
})

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

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

相关文章

探索 Milvus 存储系统:如何评估和优化 Milvus 存储性能

欢迎来到探索 Milvus 系列。Milvus 是一款支持水平扩展和具备出色性能的开源向量数据库。Milvus 的核心是其强大的存储系统&#xff0c;是数据持久化和存储的关键基础。该系统包括几个关键组成部分&#xff1a;元数据存储&#xff08;meta storage&#xff09;、消息存储&#…

bugku-web-source

kali中先用dirsearch工具扫描后台目录&#xff0c;然后用wget -r url/.git命令递归下载后&#xff0c;进入txt文件使用git reflog命令然后只用git show查看作者提交flag日志&#xff0c;用git show 一个一个去尝试&#xff0c;很多假的flag git reflog 是一个 Git 命令&#x…

【Golang】清理Markdown未引用图片

概述 本文介绍一个使用Go语言编写的脚本&#xff0c;其功能是清理指定目录中未被Markdown文件引用的图片。该脚本通过读取Markdown文件中的图片引用&#xff0c;与存储在特定目录下的所有图片进行对比&#xff0c;将未引用的图片移动到另一个指定的目录中。此脚本适用于需要维护…

苹果电脑怎么使用Windows软件 苹果笔记本怎么安装Windows mac怎么安装windows

最早的苹果电脑的概念是在1976年的时候由乔布斯提出来的&#xff0c;在1977年的时候发行的第一款个人电脑&#xff0c;也就是苹果笔记本电脑。苹果笔记本的操作系统是MAC OSmac OS是基于unix内核的系统&#xff0c;这个系统是专门为苹果电脑开发的。macOS比windows的视觉冲击大…

Synchronized的锁升级过程是怎样的?

文章目录 一、Synchronized的使用1、修饰实例方法2、修饰静态方法3、修饰代码块4、总结&#xff1a; 二、Monitor1、Java对象头1.1 32 位虚拟机的对象头1.2 64位虚拟机的对象头 2、Mark Word 结构3、Moniter4、Synchronized 字节码5、轻量级锁6、锁膨胀7、自旋优化8、偏向锁9、…

Laravel Sanctum:简化无状态API认证的新纪元

Laravel Sanctum&#xff1a;简化无状态API认证的新纪元 在现代Web应用中&#xff0c;API的安全认证是一个核心需求。Laravel Sanctum是一个轻量级的认证解决方案&#xff0c;专为Laravel开发的单页应用&#xff08;SPA&#xff09;、移动应用和API而生。它提供了一种简单而灵…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一&#xff1a;项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下&#xff0c;进行C网络开发的基本概念&#xff1a;TCP/IP socket通信&#xff0…

【diffusers极速入门(五)】扩散模型中的 Scheduler(noise_scheduler)的作用是什么?

系列文章目录 【diffusers 极速入门&#xff08;一&#xff09;】pipeline 实际调用的是什么&#xff1f; call 方法!【diffusers 极速入门&#xff08;二&#xff09;】如何得到扩散去噪的中间结果&#xff1f;Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

Vue中!.和?.是什么意思

在Vue&#xff08;或更广泛地说&#xff0c;在JavaScript和TypeScript中&#xff09;&#xff0c;!. 和 ?. 是两个与可选链&#xff08;Optional Chaining&#xff09;和断言非空&#xff08;Non-null Assertion&#xff09;相关的操作符&#xff0c;它们分别用于处理可能为nu…

Java集合之HashMap的数据结构分析

总所周知&#xff0c;Java中键值对集合&#xff0c;我们最常用的就是HashMap&#xff0c;那么它的数据结构&#xff0c;以及如何存储键值对&#xff0c;包括为什么使用红黑树&#xff0c;链表等许多数据结构&#xff0c;下面我们一起学习交流 1.HashMap的数据结构&#xff1a;…

scratch二次开发:如何修改toolbox宽度

大家好&#xff0c;我是小黄。 使用场景&#xff1a;有时候我们开发图形化编程时&#xff0c;我们的积木块很长&#xff0c;导致一部分无法显示&#xff0c;我们想要把目录区域位置放大&#xff0c;比如下面红色方框区域位置&#xff0c;那么改如何实现这个过程呢&#xff1f;…

代码随想录 Day27 || 455分发饼干 376摆动序列 53最大子数组和

关于贪心算法&#xff08;摘自hello算法&#xff09; 贪心算法&#xff08;greedy algorithm&#xff09;是一种常见的解决优化问题的算法&#xff0c;其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决策&#x…

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如&#xff0c;通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息&#xff0c;并通过print打印出来。将其打包成.exe,通过Qt来调用&#xff0c;并获取到.exe程序运行的结果 简单示例代码&#xff1a; // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…

【机器学习】机器学习的基本概念、算法的工作原理、实际应用案例

一、机器学习的基本概念 定义&#xff1a; 机器学习是人工智能的一个分支&#xff0c;它使计算机能够在没有明确编程的情况下从数据中学习并改进其性能。机器学习的目标是让计算机自动学习模式和规律&#xff0c;从而能够对未知数据做出预测或决策。 主要类型&#xff1a; 监…

嵌入式学习Day14---C语言进阶

目录 一、构造类型 1.1.结构体 1.存储 2.输入输出&#xff08;传参&#xff09; 3.结构体数组 1.2.共同体&#xff08;联合体&#xff09; 1.格式 2.存储 3.测试一个平台是打端还是小端 1.3.枚举 1.格式 2.特点 二、位运算&#xff08;操作二进制&#xff09; 2.1.&a…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12&#xff0c;开发者工具&#xff0c;网络 1、web基本概念 web服务器&#xff08;web server&#xff09;&#xff1a;也称HTTP服务器&#xff08;HTTP server&#xff09;&am…

android移动开发基础期末看这一篇就ok了

android编程题 界面布局 使用TableLayout布局实现一个简单的计算器界面。 常见控件 开发一个整数加法的程序&#xff0c;实现将计算结果显示到界面上的功能。 开发一个自定义对话框&#xff0c;其界面中显示标题、提示内容、确定和取消按钮。当点击回退健时&#xff0c;用于…

如何获取文件缩略图(C#和C++实现)

在C中&#xff0c;可以有以下两种办法 使用COM接口IThumbnailCache 文档链接&#xff1a;IThumbnailCache (thumbcache.h) - Win32 apps | Microsoft Learn 示例代码如下&#xff1a; VOID GetFileThumbnail(PCWSTR path) {HRESULT hr CoInitialize(nullptr);IShellItem* i…

翻译: 可视化深度学习神经网络一

这是一个随意书写的28*28像素、分辨率很低的数字 3 但你的大脑一看见就能轻松辨识出来 &#xff0c;我想要你好好欣赏这点 人脑能够毫无障碍地辨识是非常厉害的 我的意思是&#xff0c;这个、这个、还有这个&#xff0c;都能被识别为 3 即使前后图像的图形组成有很大差异 当你…

懂个锤子Vue 项目工程化扩展:

Vue项目工程化扩展&#x1f4f6;&#xff1a; 前言&#xff1a;当然既然学习框架的了&#xff0c;HTMLCSSJS三件套必须的就不说了&#xff1a; JavaScript 快速入门 紧跟前文&#xff0c;目标学习Vue2.0——3.0&#xff1a; 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的…