Vue3-Vue3生命周期、自定义hook函数、toRef与toRefs、其他组合式API、组合式API的优势、Vue3新的组件和功能

news2024/11/19 15:37:25

Vue3(2)

更多Vue.js知识请点击——Vue.js

🥔:有的山长满荆棘,有的山全是野兽,所以你应该是自己的那座山

文章目录

  • Vue3(2)
    • 一、Vue3生命周期
    • 二、自定义hook函数
    • 三、toRef与toRefs
    • 四、其他Composition API
      • 1、shallowRef与shallowReactive
      • 2、readonly与shallowReadonly
      • 3、toRaw 与 markRaw
      • 4、customRef
      • 5、provide和inject
      • 6、响应式数据的判断
    • 五、组合式API的优势
      • 1、选项式API的问题
      • 2、组合式API的优势
    • 六、新的组件
      • 1、Fragment
      • 2、Teleport
      • 3、Suspense
    • 七、其他
      • 1、全局API的转移
      • 2、其他改变

一、Vue3生命周期

请添加图片描述

以上是Vue3的8个生命周期钩子(beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeUnmount、unmounted),可以倒回去看看和Vue2的生命周期的区别。点击此处复习Vue2生命周期

Vue3中可以继续使用Vue2中的生命周期钩子(写在setup函数外面),但是有两个更改:

beforeDestroy 改名为 beforeUnmount
destroyed 改名为 unmounted

如果要写在setup函数里面,那么要注意,这些钩子会换名字

beforeCreate ===> setup()
created =======> setup()
beforeMount ===> onBeforeMount
mounted =======> onMounted
beforeUpdate ===> onBeforeUpdate
updated =======> onUpdated
beforeUnmount ==> onBeforeUnmount
unmounted =====> onUnmounted

如果写到setup函数里面,是没有beforeCreatecreated这两个钩子的,因为setup的执行时机就相当于这两个钩子(setup会先于所有的钩子执行,把想在这两个钩子里写的代码写到steup最前面就行了)

请添加图片描述

二、自定义hook函数

  • hook本质是一个函数,用use开头,把setup函数中使用的Composition API进行了封装。
  • 和vue2中的mixin类似。点击此处复习vue2-mixin
  • 自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂

请添加图片描述

三、toRef与toRefs

作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。

请添加图片描述

应用: 要将响应式对象中的某个属性单独提供给外部使用时。

这样的话当我们去修改这些重新定义的属性时,会同步更改person中的对应属性。但是如果const name = ref(person,'name'),这样可以改name,但是person中的name不会同步修改,这就是toRef和ref的区别

扩展:toRefstoRef功能一致,但可以批量创建多个 ref 对象,语法:

const { name } = {...toRefs(person)}

请添加图片描述

四、其他Composition API

1、shallowRef与shallowReactive

shallow:浅层的、肤浅的。

shallowReactive:只处理对象最外层属性的响应式(浅响应式)。

shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。

使用场景:

  • 如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。
  • 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。

2、readonly与shallowReadonly

readonly: 让一响应式数据变为只读的(深只读,每一层都不能改,都是readonly)。

shallowReadonly:让一个响应式数据变为只读的(浅只读,只有第一层readonly,深层次仍然可以改)。

使用场景: 不希望数据(尤其是这个数据是来自与其他组件时)被修改时。

请添加图片描述

3、toRaw 与 markRaw

raw:原始的、未加工的。

toRaw:把什么变为原始。

markRaw:把什么标记为原始。

toRaw将一个由reactive生成的响应式对象转为普通对象。

使用场景:用于读取响应式对象对应的普通对象,对这个对象的所有操作,不会引起页面更新。

markRaw标记一个对象,使其永远不会再成为响应式对象。

使用场景:

  1. 有些值不应别设置为响应式,例如复杂的第三方类库等。
  2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

4、customRef

custom:自定义、定制。

track:追踪。

trigger:触发。

customRef创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显示控制。

通过customRef实现防抖效果:

<template>
  <input type="text" v-model="keyword" />
  <h3>{{ keyword }}</h3>
</template>

<script>
import { customRef, ref } from "vue";
export default {
  name: "App",
  setup() {
    // 根据Vue提供的ref
    // let keyword = ref("hello");

    // 自定义的ref
    function myRef(value, delay) {
      let timer;
      console.log("---myRef---");
      const x = customRef((track, trigger) => {
        return {
          get() {
            console.log(`有人从myRef容器中读取数据,我把${value}给他了`);
            track(); //通知Vue追踪数据value的变化
            return value;
          },
          set(newValue) {
            console.log(`有人把myRef容器数据改了,改为了:${newValue}`);
            // 通过一直开启关闭定时器实现防抖效果,停止delay毫秒后才读取到结果
            clearTimeout(timer);
            timer = setTimeout(() => {
              value = newValue;
              trigger(); //通过Vue去重新解析模板
            }, delay);
          },
        };
      });
      return x;
    }
      
    let keyword = myRef("hello", 500);

    return {
      keyword,
    };
  },
};
</script>

5、provide和inject

provide:提供。

inject:注入。

作用:实现祖与后代组件间通信

套路:父组件有一个 provide 选项来提供数据,后代组件有一个 inject 选项来开始使用这些数据

具体写法:

请添加图片描述

请添加图片描述

注:可以给任何后代传递数据(子、孙、曾孙。。。),但是父子间一般不用这个,因为父子间通信有世界上最简单的方式,就是props

6、响应式数据的判断

isRef: 检查一个值是否为一个 ref 对象
isReactive: 检查一个对象是否是由 reactive 创建的响应式代理
isReadonly: 检查一个对象是否是由 readonly 创建的只读代理
isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

五、组合式API的优势

1、选项式API的问题

使用传统的OptionsAPI,新增或者修改一个需求,需要分别在data、methods、computed中修改,这样不太好维护。

请添加图片描述

请添加图片描述

2、组合式API的优势

组合式API可以把相关功能的代码更有序地组织在一起,这样不仅更好维护,而且更优雅~

请添加图片描述

请添加图片描述

六、新的组件

1、Fragment

fragment:片段、碎片

  • 在Vue2中,组件必须有一个根标签
  • 在Vue3中,组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中
  • 好处:减少标签层级,减小内存占用

2、Teleport

teleport:传送、瞬间移动。

Teleport 一种能够将我们的组件html结构移动到指定位置的技术。

请添加图片描述

to='xxx':指移动位置,值可以是body等html结构。如上例把teleport里面的内容移动到了body标签内。

请添加图片描述

3、Suspense

suspense:悬念

等待异步组件时渲染一些额外内容,提升用户体验,类似于路由懒加载吧
defineAsyncComponent可以实现异步加载

使用Suspense包裹组件,并配置好defaultfallback当default插槽里面的内容还没出来时,先展示fallback里面的内容。

这个路由懒加载的效果会在网速慢或者setup返回promise时较为明显。

前面讲setup的时候说到:setup里面不能用async,返回值不能为promise,现在可以进行补充,setup可以返回promise,但是要和suspense还有异步组件配合使用。

请添加图片描述

请添加图片描述

七、其他

1、全局API的转移

Vue2中有许多全局API和配置

  • 例如:注册全局组件、注册全局指令等。
// 注册全局组件
Vue.component('MyButton',{
    data:()=>({
        count:0
    }),
    template:`<button @click="count++">Clicked {{count}} times.</button>`
})

// 注册全局指令
Vue.directive('focus',{
    inserted:el => el.focus()
})

Vue3对这些API做出了调整:

  • 将全局的API,即:Vue.xxx调整到应用实例app
2.x 全局API(Vue)3.x 实例API(app)
Vue.config.xxxapp.config.xxx
Vue.config.prodution.Tip移除
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use
Vue.prototypeapp.config.glocalProperties

2、其他改变

  • Vue3里的data选项应始终被声明为一个函数。

    我们之前在Vue2里提到data有两种写法,一种是对象式data:{},一种是函数式data(){},当使用组件时必须用函数式,这是因为Object是引用数据类型,里面保存的是内存地址,单纯写成对象形式,就会使得所有组件实例共用一份data,造成一个变全都变得结果。如果data是一个函数的话,每复用一次组件,就会返回一份新的data(类似于给每个组件实例创建了一个私有的数据空间,让各个组件实例维护各自的数据)。

    而Vue3严格规定data只能写成函数式。

  • 过渡类名的更改

    Vue2写法:

    .v-enter,
    .v-leave-to {
        opacity: 0;
    }
    .v-leave,
    .v-enter-to {
        opacity: 1;
    }
    

    Vue3写法:更清晰更语义化

    .v-enter-from,
    .v-leave-to {
        opacity: 0;
    }
    .v-leave-from,
    .v-enter-to {
        opacity: 1;
    }
    
  • 移除了keyCode作为v-on的修饰符,同时也不再支持config.keyCodes

  • 移除v-on.native修饰符

    父组件中绑定事件:

    <my-component 
    	v-on:close="handlerComponentEvent"
        v-on:click="handlerNativeClickEvent"
    />
    

    子组件中声明自定义事件:

    <script>
        export default{
            // 声明为自定义事件,不声明就一直看成原生事件
            emits:['close']
        }
    </script>
    
  • 移除过滤器(filter)

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

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

相关文章

Ctfshow web入门 phpCVE篇 web311-web315 详细题解 全

CTFshow phpCVE web311 CVE-2019-11043 PHP远程代码执行漏洞复现&#xff08;CVE-2019-11043&#xff09;【反弹shell成功】-腾讯云开发者社区-腾讯云 (tencent.com) 漏洞描述 CVE-2019-11043 是一个远程代码执行漏洞&#xff0c;使用某些特定配置的 Nginx PHP-FPM 的服务…

RabbitMQ的工作模式——WorkQueues

1.工作队列模式 生产者代码 public class Producer_WorkQueues1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133&qu…

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow环境Keras环境Android环境1. 安装AndroidStudio2. 导入TensorFlow的jar包和so库3. 导入OpenCV库 相关其它博客工程源代码下载其它资料下载 前言 本项目依赖于Keras深度学习模型&#xff0c;旨在对手语…

idea更改java项目名

做了一个普通的java项目&#xff08;使用socket进行网络通信的练手项目&#xff09;&#xff0c;需要更改项目名&#xff0c;更改过程记录在这里。 修改项目名可能会出现很多错误&#xff0c;建议先备份当前项目 1.在idea里&#xff0c;右键项目名——》选择Refactor——》选择…

服务注册发现_搭建单机Eureka注册中心

创建cloud-eureka-server7001模块 pom添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

Xshell工具连接本地虚拟机Linux系统

你知道的越多&#xff0c;你不知道的越多&#xff1b;本文仅做记录&#xff0c;方便以后备阅。希望也能帮到正在看这篇文章的你。 使用Xshell工具连接Linux系统具有方便&#xff0c;易于操作等诸多特点。对于Xshell的介绍&#xff0c;我就不详细说了。我相信百度百科上的介绍更…

RabbitMQ工作模式——PubSub生产者及消费者

PubSub模式生产者代码 public class Producer_PubSub {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133"); ip 默…

SAP PO运维(四):适配器消息监控

登录SAP PO系统,点击“Configuration and Monitoring Home”,使用PISUPER账号登录: 2、选择“适配器引擎->消息监控器”: 3、查看是否有报错消息: 双击报错的数字,筛选出报错的条目(可以根据状态、接口命名空间等来筛选):常见的报错消息有: 接口配置问题:字段为空值…

java框架-Springboot3-场景整合

文章目录 java框架-Springboot3-场景整合批量安装中间件NoSQL整合步骤RedisTemplate定制化 接口文档远程调用WebClientHttp Interface 消息服务 java框架-Springboot3-场景整合 批量安装中间件 linux安装中间件视频 NoSQL 整合redis视频 整合步骤 RedisTemplate定制化 Re…

Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例

Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例 第18章-Qt MyselfQQ18.1 概述18.2 、发送文件18.3 、接收文件18.4 、保证传输的安全和稳定18.5 、总结 本章相关例程源码下载1.Qt5开发及实例_CH1801.rar 下载 第18章-Qt MyselfQQ 18.1 概述 MyselfQQ是一个基于Qt5框架开发的轻量…

技术学习群-第三周内容共享

本周为技术群聊的第三周&#xff0c;看看本周&#xff0c;都聊了些啥。 探讨u2以及appium 什么是u2&#xff1f;也就是uiautomator2&#xff0c;主要探讨的是uiautomator2与appium哪个更好用。 为什么探讨&#xff1f;他们拿来干什么的&#xff1f; 都是可以拿来做app自动化的&…

基于springboot+vue的毕业生实习与就业管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

C语言之字符函数字符串函数篇(1)

目录 前言 求字符串长度 strlen strlen统计的是字符串\0之前的字符串长度 字符指针 strlen的返回值是无符号整型 strlen的三种模拟实现 计数器 函数递归 指针_指针 长度不受限制的字符串函数 strcpy strcpy会将源字符串中的 \0 拷贝到目标空间 strcpy参数目标空…

cocos2dx查看版本号的方法

打开文件&#xff1a;项目根目录\frameworks\cocos2d-x\docs\RELEASE_NOTES.md 知道引擎版本号的意义&#xff1a; 1.面试中经常被问到(面试官想知道你会不会查版本号&#xff0c;你会查也不一定会去看&#xff0c;如果你去看了说明你是一个有心人&#xff0c;或者想深入研究下…

Innodb 原理和日志

一、MySQL结构 客户端 server层 查询缓存&#xff08;5.7&#xff09; 连接器 分析器 优化器 执行器 引擎层 二、一条update操作mysql的流程 三、MySQL的日志 &#xff08;1&#xff09;redo log 保证MySQL 持久性的关键&#xff0c;如果MySQL宕机&#xff0c;buffer pool…

Jupyter 报错:can‘t convert np.ndarray of type numpy.object_.

can’t convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool. 解决方案&#xff1a;使用.astype(“float64”)强制转化

软件测试人员必须知道的接口测试基础

一、首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能…

[项目管理-34]:项目经理在强矩阵与弱矩阵管理中不同的作用

目录 一、项目管理与模式 1.1 项目管理 1.2 项目管理模式 1.3 项目管理的矩阵结构 二、项目管理不同矩阵结构的比较 2.1 职能型、项目型、矩阵型 2.2 弱矩阵、强矩阵、平衡矩阵 2.3 不同矩阵对项目经理的能力要求 一、项目管理与模式 1.1 项目管理 项目管理是在特定的…

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…