Vue--》Vue3生命周期以及其它组合API的讲解

news2024/12/29 9:06:52

目录

生命周期

自定义hook函数

toRef

shallowReactive与shallowRef

readonly与shallReadonly

toRaw与markRaw


生命周期

Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但是有两个被更名:Vue2中的beforeDestroy改名为:beforeUnmount;Vue2中的destroyed改名为:unmounted。由原来的挂载到销毁变成现在的挂载到卸载。

总的来说,变化虽然有但是不大;Vue2的生命周期讲解可参考:Vue2生命周期讲解 。Vue3官方给的生命周期图示如下:

根据代码来去实现它的过程:

<template>
  <h2>现在的数值是:{{ num }}</h2>
  <button @click="num++">点我加1</button>
</template>
<script>
import {ref} from 'vue'
export default {
  name:'Mydemo',
  setup(){
    let num = ref(0)
    return {
      num
    }
  },
  // 通过配置项的形式使用生命周期钩子
  beforeCreate() {
    console.log('---beforeCreate---');
  },
  // 当组件在内存中被创建完毕之后,会自动调用created函数
  created(){
    console.log('---created---');
  },
  beforeMount(){
    console.log('---beforeMount---');
  },
  // 当组件被成功的渲染到页面上之后,会自动调用mounted函数
  mounted(){
    console.log('---mounted---');
  },
  beforeUpdate(){
    console.log('---beforeUpdate---');
  },
  // 当组件被重新渲染完毕之后,会自动调用updated函数。
  updated(){
    console.log('---updated---');
  },
  beforeUnmount(){
    console.log('---beforeUnmount---');
  },
  // 当组件被卸载完毕之后,会自动调用unmounted函数
  unmounted(){
    console.log('---unmounted---');
  }
}
</script>

通过App根组件去导入注册该组件,通过按钮的切换来实现组件的创建与销毁过程:

<template>
  <button @click="isShowDemo = !isShowDemo">切换显示与隐藏</button>
  <Demo v-if="isShowDemo"></Demo>
</template>
<script>
import {ref} from 'vue'
import Demo from './components/test/demo.vue'
export default {
  name:'MyApp',
  components:{
    Demo
  },
  setup(){
    let isShowDemo = ref(true)
    return{
      isShowDemo
    }
  },
}
</script>

当然,Vue3.x也提供了Composition API形式的生命周期钩子,与Vue3.0中配置项钩子对应关系如下:

beforeCreate与created 两者就相当于 setup()

beforeMount 相当于 onBeforeMount ;mounted 相当于 onMounted

beforeUpdate 相当于 onBeforeUpdate ;updated 相当于 onUpdated

beforeUnmount 相当于 onBeforeUnmount ;unmounted 相当于 onUnmounted

 这些生命周期的钩子都是函数,如果你想在 setup 中去使用的话,肯定的是需要去从vue中按需导入的,和ref一样。如下:

这里可能会有人有想法了,我能不能同时在配置项里和setup的组合式API里 ,同时使用生命周期钩子,好吧,如果你这么干了,你可能就会发现这么一个现象,在setup中的组合式API里调用的生命周期钩子的执行时机是比配置项里面的生命周期钩子快的。但是我们正常开发来说,要么就在配置项里写,要么就在setup里面写。同时写的人感觉是挺无聊的。鱿鱼须:你有我了解Vue?行,只要你不嫌麻烦,随你!

自定义hook函数

hook本质上是一个函数,把setup函数中使用的Composition API进行了封装,类似 Vue2.x 中的mixin,其优势在于:复用代码,让setup中的逻辑更加清楚易懂。

我们在外部声明了一个js函数方法,只要程序员有需要,就只要引入该文件,使用该方法即可。

import {onMounted, reactive, onBeforeUnmount} from 'vue'
export default function(){
  // 数据
  let point = reactive({
    x:0,
    y:0
  })
  // 坐标方法
  function showPoint(event){
    point.x = event.pageX
    point.y = event.pageY
    console.log(event.pageX,event.pageY);
  }
  onMounted(()=>{
    window.addEventListener('click',showPoint)
  })
  onBeforeUnmount(()=>{
    window.removeEventListener('click',showPoint)
  })
  // 将得到的数据给返回出去
  return point
}

引入该文件进行使用:

<template>
  <h2>当前点击时鼠标的坐标为:x:{{point.x}},y:{{ point.y }}</h2>
</template>
<script>
// 引入
import usePoint from '../hook/hook.js'
export default {
  name:'Mydemo',
  setup(){
    let point = usePoint()
    return {
      point
    }
  },
}
</script>

toRef

创建一个ref对象,其value值指向另一个对象中的某个属性。主要用于将响应式对象中的某个属性单独提供给外部使用。

所以接下来,我们把这些响应式对象中的数据属性单独叉出来,通过toRef进行调理:

有人觉得,这种不是更麻烦了吗?还不如一层层将数据点出来了呢,别急,toRef只是负责单个对象属性,如果项目中对象数据成百上千可能效率很低,我们可以使用 toRefs ,这种会负责一个对象数据中的多个属性数据处理,极大的方便了书写,如下:

shallowReactive与shallowRef

shallowReactive:只处理对象最外层属性的响应式(浅响应式)。如果有一个对象数据,结构比较深,但变化只是在外层变化,可以使用。节省了一些资源!

shallowRef:只处理基本数据类型的响应式,不进行对象处理。如果有一个对象数据,后续功能不会修改该对象中的属性,而是生成新的对象来替换,可以使用。

readonly与shallReadonly

readonly能让一个响应式数据变为只读的(深只读);shallowReadonly能让一个响应式数据变为只读的(浅只读)

这种方法一般应用场景是在引入别人组件时,调用的数据上来就设置只读的,为了避免把别人组件中的数据进行修改。

toRaw与markRaw

toRaw作用:是将一个由reactive生成的响应式对象转为普通对象。用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。

markRaw作用:标记一个对象,使其永远不会再成为响应式对象。有些值不应被设置为响应式的,例如复杂的第三方类库等。当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

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

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

相关文章

【数字孪生百科】可视化图表知识科普——Pareto图(Pareto Chart)

简介Pareto图&#xff08;Pareto Chart&#xff09;又称帕累托图、排列图&#xff0c;是一种特殊类型的条形图。图中标绘的值是按照事件发生的频率排序而成&#xff0c;显示由于各种原因引起的缺陷数量或不一致的排列顺序。Pareto图是根据 Vilfredo Pareto 命名的&#xff0c;他…

Go语言设计与实现 --Goroutine

Goroutine是GMP模型中的G&#xff0c;是属于用户态的线程&#xff0c;由Go runtime管理&#xff0c;而不是操作系统管理。 数据结构 type g struct {goid int64 // 唯一的goroutine的IDsched gobuf // goroutine切换时&#xff0c;用于保存g的上下文stack stack // 栈gopc…

Android Studio调用so库中方法

一、JNI规范so库调用 在 Android Studio生成自己的so库 中已经创建了自己的so库&#xff0c;这是一个JNI规范的so库&#xff0c;可以直接将so库放到libs中&#xff0c;并按照上面文章中MainActivity中的调用方法使用。 1、build.gradle&#xff08;app&#xff09;配置 andro…

SHELL脚本学习 --- 第六次作业(正则和sed)

SHELL脚本学习 — 第六次作业 思路&#xff1a; 作业1&#xff1a; 1&#xff0c;正则匹配h或H即可 2&#xff0c;sh$匹配以sh结尾 3&#xff0c;使用[[:space:]]匹配空格&#xff0c;[^[:space:]]匹配非空格 4&#xff0c;^to开头&#xff0c;中间.匹配任意字符0次或多次&…

Java一学就会系列:介绍与第一个java程序

系列文章目录 java环境-jdk环境安装与配置&#xff08;jdk1.8&#xff09; 文章目录系列文章目录前言一、JAVA是什么&#xff1f;二、环境安装三、开发工具1. Eclipse&#xff08;推荐&#xff09;2. IntelliJ IDEA &#xff08;收费&#xff09;四、第一个Java程序总结前言 …

搭建Django项目——实现简单的API访问

1、创建Django项目 打开pycharm&#xff0c;新建Django项目&#xff0c;可以选择一个虚拟环境 建完之后目录如下&#xff1a; 2、创建应用&#xff0c;我这里命名为demo 在命令行执行 python manage.py startapp demo执行之后&#xff0c;会发现项目目录下多了demo文件夹…

Linux小黑板(6):软硬链接

"飞吧&#xff0c;去寻觅红色的流星!"一、软硬链接简介软链接:软链接又叫符号链接&#xff0c;这个文件包含了另一个文件的路径名。可以是任意文件或目录&#xff0c;可以链接不同文件系统的文件。软链接硬链接:硬链接&#xff08;hard link&#xff0c;也称链接&…

美创科技深度参编,中国信通院《数据安全治理实践指南(2.0)》发布

1月5日&#xff0c;由中国信息通信研究院、中国通信标准化协会指导&#xff0c;中国通信标准化协会大数据技术标准推进委员会主办&#xff0c;数据安全推进计划承办的第二届数据安全治理峰会成功召开&#xff0c;多项数据安全研究重要成果发布。会上&#xff0c;美创科技参与编…

MyBatis中数组套数组的格式

数组套数组的形式写法 1.dao层 List<Regulation> queryAllRegulations(); 配置 <resultMap id"RegulationResultMap" type"com.elfsack.cs.dto.allot.Regulation"><result column"shop_code" property"shopCode" /…

ARM32平台系统crash(系统崩溃) 问题定位的一种解决方法

说明 分享一种crash问题定位的一种解决方法&#xff0c;仅供参考。 ARM32平台上通过错误使用内存&#xff0c;触发系统异常&#xff0c;系统崩溃。系统异常被挂起后&#xff0c;能在串口中看到异常调用栈打印信息和关键寄存器信息。 如下所示&#xff0c;excType表示异常类…

上传文件前后端处理【vue3 + springboot】

前端 1.处理modal框 <template><n-modalv-model:show"modalVisible"preset"card":title"title"class"w-700px"><n-space class"w-full pt-16px" :size"24" justify"end"><n-but…

python数据分析:采集分析岗位数据,看看薪资的高低都受什么因素影响呢

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 在我们学习的时候,通常会产生疑问:这个行业前景好不好呢? 今天我们就用python的数据分析这个就业方向来举例 看一下都有哪些因素影响了薪资的高低呢&#xff1f; 数据采集 模块使用: reques…

这些js原型及原型链面试题你能做对几道

一、前言 在面试过程中&#xff0c;频频被原型相关知识问住&#xff0c;每次回答都支支吾吾。后来有家非常心仪的公司&#xff0c;在二面时&#xff0c;果不其然&#xff0c;又问原型了&#xff01; 我痛下决心用了两天时间钻研了下原型&#xff0c;弄明白后发现世界都明亮了…

Spark 在 KaiwuDB 中的应用与实践

线上沙龙-技术流第 24 期营业啦01月12日&#xff08;周四&#xff09;19:30开务数据库 - B站直播间当数据库面对大量数据复杂 OLAP 查询时&#xff0c;性能出现局限性&#xff0c;无法满足用户 AP 方面的高性能要求。为此&#xff0c;KaiwuDB 推出了此项解决方案&#xff1a;借…

【NI Multisim 14.0原理图环境设置——电路图属性设置】

目录 序言 一、电路图属性设置 &#x1f34a;1.设置对象可见性 &#x1f34a;2.设置图纸颜色 &#x1f34a;3.设置图纸尺寸 &#x1f34a;4.设置图纸方向 &#x1f34a;5.设置图纸单位 &#x1f34a;6.设置图纸网格点 &#x1f34a;7.设置图纸边框 &#x1f34a;8. 设…

ELK安装使用

太久没用了&#xff0c;熟悉一下。 JDK1.8以上环境 下载地址 elasticsearch&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch kibana: https://www.elastic.co/cn/downloads/kibana logstash &#xff1a; https://www.elastic.co/cn/downloads/logstash…

社招前端二面必会手写面试题总结

字符串查找 请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中&#xff0c;并返回第一次出现的位置&#xff08;找不到返回 -1&#xff09;。 a34;b1234567; // 返回 2 a35;b1234567; // 返回 -1 a355;b12354355; // 返回 5 isContain(a,b);function isContain(a,…

RS—|下载Landsat8/9数据并进行ENVI大气校正(FLAASH模型)

文章目录1、 数据的下载。2、 辐射定标3、大气校正1、 数据的下载。 下载网址&#xff1a;链接: GloVis (usgs.gov)。下载的数据为2022年8月1日湖南省北部的遥感影像数据。该数据为L1级产品&#xff0c;只经过了几何校正&#xff0c;没有经过辐射定标和大气校正。 图1-1.下载…

富而喜悦2023直播盛典 唐苓馨主题演说“特别的礼物”!

网讯2023年1月1日19:30&#xff0c;富而喜悦一年一渡“特别的礼物”新年主题直播盛典晚会如约而至。富而喜悦品牌创始人唐苓馨女士&#xff0c;用自己与身边人的真实故事&#xff0c;为您讲述了“遇见生活中特别的礼物”。以下是富而喜悦品牌创始人唐苓馨女士在2023富而喜悦一年…

手写RPC框架05-通过SPI机制增加框架的扩展性的设计与实现

源码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v6 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现 现有的问题 在上一章节末尾我们提到了&#xff0c;目前我们的RPC框架可扩展性…