如何定义、注册以及什么是异步组件?

news2024/11/15 18:23:53

一. 如何定义异步组件

定义异步组件需要使用vue提供的 defineAsyncComponent() 方法:

 

注意:通过观察大家也可以发现,所谓的异步组件就相当于给普通组件套了一层外壳(defineAsyncComponent()),当然现在还不能感受到异步组件的魅力,不着急,咱们继续学习。

二. 如何注册异步组件(两种注册方式):

1. 局部注册

在1.1中所使用的方式就是局部注册,跟普通组件的局部注册是一样的。

2. 全局注册

全局注册方式就是在 main.js 中使用 app.component(组件名,异步组件) 的方式进行注册。

 

现在大家去任何组件中使用 <AsyncBtn></AsyncBtn> 都能正常使用。

三. 什么是异步组件

通过 defineAsyncComponent() 方法包括的普通组件就是异步组件,这么解释太过于肤浅,让咱们通过一个现象来感受一下异步组件。

1. 通过普通方式导入组件和通过 defineAsyncComponent() 方法导入组件,但是不使用,查看控制台中 network 选项下组件的表现方式

        ① 将 <AsyncBtn></AsyncBtn> 组件以普通方式导入不使用,查看 network

        大家可以看到,虽然 <AsyncBtn></AsyncBtn> 组件没有使用,但是,同样会被加载进来。

        ② 将 <AsyncBtn></AsyncBtn> 组件以 defineAsyncComponent() 方法导入不使用,查看 network

        大家可以看到,异步组件在没有使用的时候不会被加载。

2. 通过普通方式导入组件和通过 defineAsyncComponent() 方法导入组件,但是不使用,对项目进行打包观察打包结果。

① 将 <AsyncBtn></AsyncBtn> 组件以普通方式导入,使用一下组件,打包项目观察打包结果。

大家可以看到,about 组件只打包出来了一个 AboutView-178... 文件,说明普通方式导入的组件也被打包进了 AboutView-178... 文件。

② 将 <AsyncBtn></AsyncBtn> 组件以 defineAsyncComponent() 方法导入,使用一下组件,打包项目观察打包结果。

大家可以看到,异步组件被单独打包成了一个独立文件。

3. 总结

根据以上两个现象,咱们可以总结一下什么是异步组件了。

在 Vue 中,当我们注册全局或局部组件时,它们都是同步地被“立即解析并加载”的。这意味着在我们的程序初始化时,所有组件都会通过网络被下载到内存中,并且在内存中占用一定的资源。预加载所有组件会增加页面的初始加载时间和性能降低。

而异步组件可以将我们的组件分开打包,按需要加载,这样可以减轻初始页面加载时间和减少资源浪费。当我们需要和路由配合使用时,异步组件也能帮助我们实现按需加载和动态导入。目的就是降低项目的内存占用,可以从一定程度上解决首页白屏问题。

四. 利用异步组件优化性能的案例

将来你首页的内容有很多,但是你的屏幕大小是固定的,也就是用户第一眼就只能看到第一屏的内容,之后的内容需要滚动滚动条才能看到,那么,咱们可以根据此特性,将屏幕外的内容做成动态组件,只有用户滚动到异步组件位置的时候,才加载异步组件。

大家将 AboutView 组件做成如下样式,AboutView 组件的样式可以是 100vh ,然后让他的内容块高一些,产生纵向的滚动条,模拟首页内容比较多的情况。

 

1. 想要完成接下来的效果,咱们要借助一个插件 -- @vueuse/core,他提供了一个方法 useIntersectionObserver ,可以监听某个 DOM节点是否进入了视口 

① 安装插件:npm i @vueuse/core -S

② 导入 useIntersectionObserver() 方法,并使用此方法监听某个DOM是否进入了视口      如:import { useIntersectionObserver } from '@vueuse/core' ​ /* * target: 要监听的DOM节点 * params: 只包含一个元素的数组参数,这个唯一的元素中有一个属性:isIntersecting * isIntersecting: 此属性的值是true/false,表明当前DOM节点是否进入了视口 */ useIntersectionObserver(target, (params) => {    console.log(params) })

2. 完成此案例

① 此案例的核心思想就是:在区域4放置一个异步组件,通过 v-if 指令绑定一个默认值为 false 的响应式数据;然后使用 useIntersectionObserver() 方法监听区域4是否进入视口,当进入视口时,将 v-if 绑定的响应式数据的值改为 true

如:<template>
    <div class="about">
        <h1>This is an about page</h1>
        <div class="section1">内容区域1</div>
        <div class="section2">内容区域2</div>
        <div class="section3">内容区域3</div>
        <div class="section4" ref="target">
            内容区域4
            <br />
            <AsyncBtn v-if="isShow"></AsyncBtn>
        </div>
    </div>
</template>
<script setup>
// 导入监听方法
import { useIntersectionObserver } from '@vueuse/core'
// 导入ref
import { ref } from 'vue'
// 导入定义异步组件的方法
import { defineAsyncComponent } from 'vue'
// 定义异步组件
const AsyncBtn = defineAsyncComponent(() => {
    return import('@/components/async/AsyncButton.vue')
})
​
// 获取区域4 DOM节点
const target = ref(null)
// 控制 <AsyncBtn></AsyncBtn> 是否显示的变量
const isShow = ref(false)
​
// 监听区域四是否进入视口
useIntersectionObserver(target, ([{ isIntersecting }]) => {
    if (isIntersecting) {
        // 这里为什么不直接让 isShow.value = isIntersecting;
        // 因为 isIntersecting 会随着滚动在true和false之间切换,如果按以上方式赋值,那么<AsyncBtn></AsyncBtn>组件会被反复销毁重建,显然性能上肯定不够优秀。
        isShow.value = true
    }
})
</script>

② 思考

如果将来你不知道从哪一部分开始将你的项目的组件做成按需加载,比如当前案例中的内容区域2。但其实你完全不用担心,你完全可以把第一部分除外的其他部分根据你的需求做成按需加载,因为 useIntersectionObserver() 方法不仅会再DOM节点出现时执行,在DOM节点不出现是也会执行,所以你完全可以根据 isIntersecting 属性的true和false控制异步组件的显示与否。

五. <Suspense> 组件

1. <Suspense> 组件是用来跟异步组件一起使用的,他主要是用来处理当异步组件中导入的组件一直导入不成功时,定制一个默认显示内容。

2.  什么情况下异步组件中导入的组件会不成功呢?

        异步组件中导入的普通组件能被导入成功的前提是普通组件的生命周期执行完毕,也就是组件创建好了。如果生命周期没有执行完毕,那么 import() 方法就无法将组件导入!

3.  但是,一个组件的生命周期执行是非常迅速的,那么,什么情况下组件的生命周期会被阻断?

        要想理解什么情况下生命周期会被组件,大家要知道一个知识点,就是当你通过setup语法糖(<script setup>)写组件逻辑时,<script setup></script> 标签内部就相当于是一个 async 函数的函数体。所以,在他里边就可以使用 await 关键词阻断组件的生命周期了。

如: <script setup>
let res = await new Promise((resolve) => {
    setTimeout(() => {
        resolve('hello,生命周期被阻断了5秒钟')
    }, 5000)
})
console.log(res)
</script>

注意:最好把完整案例写完之后,再去测试,因为如果不配合 <Suspense> 组件去使用被阻断生命周期的组件,控制台会报错。                                                        注意:   <Suspense> 组件有两个插槽, #default 插槽是你最终要展示的组件, #fallback 组件是你最终组件未加载成功之前的占位组件,或者叫做提示组件。

强调:如果你的异步组件是语法糖模式,那么,当你的js中没有使用await关键词时,那么,你的setup就是一个同步的setup; 当你使用了await这样的关键词时,vue会自动将setup转换成 async setup; 当你的异步组件是一个 async setup 组件时,必须配合 <Suspense> 内置组件使用

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

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

相关文章

大模型入门到精通——Prompt Engineering工程

Prompt Engineering 1. Prompt Engineering 的意义 在 LLM&#xff08;大语言模型&#xff09;时代&#xff0c;Prompt Engineering&#xff08;提示工程&#xff09;已经成为开发者与用户的重要技能和概念。随着大模型&#xff08;如 GPT、GLM、BERT 等&#xff09;的快速发…

Windows SDK(九)登录框和计算器练习

这节课我们分别开始讲解登录框和计算机的实现 登录框实现 我们以上节课所学&#xff0c;自行创建一个对话框&#xff0c;ID为IDD_DIALOG1并将他编辑为一个登录框的样式。其中我们将账户的编辑框ID设置为IDC_ENIT_USERNAME&#xff0c;密码的编辑框ID设置为IDC_ENIT_PASSWORD。…

tm和r商标哪个最放心用!

有个网友联系普推知产老杨&#xff0c;问申请的商标可以授权使用不&#xff0c;这个没有下商标注册证&#xff0c;基本上没多大用&#xff0c;申请的商标也可以授权&#xff0c;但是由于该商标尚未获得注册&#xff0c;其权利状态尚不稳定会存大许多风险。 TM基本是下受理书后的…

MySQL 主从复制的两种方式详解

目录 概述 主从复制原理 环境准备 基于二进制日志的复制 配置master 配置slave 启动复制的命令 测试 Gtid方式进行主从同步 工作原理 配置master 配置slave 测试 概述 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后…

初识C语言指针(4)

目录 1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5. typedef 关键字 6. 函数指针数组 结语 1. 字符指针变量 字符指针变量就是存储字符或字符串首字符地址的变量&#xff0c;字符指针变量有2种使用方式。 最常用的使用方式&#xff1a…

pikachu-ssrf_redis

目录 SSRF 1、SSRF漏洞介绍&#xff1a; 2、SSRF漏洞原理&#xff1a; 3、SSRF漏洞利用手段&#xff1a; 4、SSRF漏洞绕过方法&#xff1a; SSRF(curl)用法 1、通过网址访问链接 2、利用file协议查看本地文件 3、dict协议扫描内网主机开放端口 4.gopher&#xff1a;威…

神经网络算法 - 一文搞懂Gradient Descent(梯度下降)

本文将从梯度下降的本质、梯度下降的原理、梯度下降的算法 三个方面&#xff0c;带您一文搞懂梯度下降 Gradient Descent | GD。 梯度下降 机器学习“三板斧”&#xff1a;选择模型家族&#xff0c;定义损失函数量化预测误差&#xff0c;通过优化算法找到最小化损失的最优模型参…

docker GBase 8sV8.8使用的常见错误

因项目需要GBase 8sV8.8数据库环境&#xff0c;所以在搭建使用过程中有一些坑和错误&#xff0c;所以记录和分享 docker搭建 docker.com获取镜像 docker pull liaosnet/gbase8s:v8.8_3503x1_x64创建容器 docker run -d -p 19088:9088 \-e SERVERNAMEgbase01 \-e USERPASSGB…

CCleaner:系统优化与隐私保护的双重守护

大家好&#xff0c;今天电脑天空要介绍一款非常实用的系统优化工具——CCleaner。如果你的电脑运行速度越来越慢&#xff0c;或者担心隐私泄露问题&#xff0c;那么CCleaner可能是你的解决方案。 系统优化&#xff0c;一键搞定 CCleaner能够智能识别并清理电脑中的临时文件、…

基于Spring Boot的文字识别系统

前端使用htmlcssjs&#xff0c;后端使用Spring Boot&#xff0c;数据库使用mysql&#xff0c;识别算法有两个&#xff0c;一个是使用百度OCR接口&#xff0c;一个是自己写一个python&#xff0c;用flask包装。 其中百度OCR接口可以去免费申请&#xff0c;然后把appid、apikey、…

k8s 部署Ruoyi-Vue-Plus之vue打包镜像

在这里插入图片描述 在这篇文章中&#xff0c;解释如何通过容器化&#xff08;Docker&#xff09;来打包和部署前端项目&#xff0c;替代之前手动维护版本的方式 1.nginx配置 在 ruoyi-ui 项目的根目录下创建一个 nginx.conf 文件, 我没有使用monitor-admin和xxljob-admin模块…

【吊打面试官系列】为什么Mysql的索引结果用B+树

Mysql如何使用索引查询数据的 下图是一个B树我们的目标节点是 13 我们先根据 13 锁定非叶子节点 2&#xff0c;计算机进行一次IO操作把叶子节点取出来&#xff0c;在叶子节点2中找到叶子节点5 里面有 13 计算机也要进行一次IO将数据取到内存里然后读数据 一共进行了 3次磁盘I…

MATLAB 快速计算点到二维直线的距离并可视化(79)

计算点到二维直线距离,主要是还提供了具体的可视化方法 MATLAB 快速计算点到二维直线的距离并可视化(79) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 问题:给定一条直线的方程 (Ax + By + C = 0) 和一个点 ((x_0, y_0)),点到直线的距离 (d) 方法:运行此脚本后,…

区块链的搭建与运维4

区块链的搭建与运维4 任务一:区块链产品需求分析与方案设计 本任务需要依据项目背景完成需求分析与方案设计,具体要求如下: 按照新能源系统的需求规定,用户可以通过本系统实现能源管理与交易、新能源资产管理与交易、用户管理等功能。本系统软件部分可划分为浏览器页面、服务…

Tina-SDK开发

开发环境搭建 获取TinaSDK源码 Tina-SDKV2.0源码网盘链接&#xff1a;https://pan.baidu.com/s/13uKlqDXImmMl9cgKc41tZg?pwdqcw7 上传到ubuntu&#xff0c;创建文件夹用来保存源码&#xff1a; ubuntuubuntu1804:~$ mkdir Tina_SDK ubuntuubuntu1804:~$ cd Tina_SDK/ ubu…

【单片机】PIC16F1719 单片机,UART,串口发送

/** 文件: main.c* 目标: PIC16F1719* 编译器: XC8 v1.41* 开发环境: MPLABX v4.10** 创建日期: 2023年8月4日 下午2:58** PIC16F1719* +-----------------+* VPP -> 1 : RE3/MCLR/VPP : 40 <> PGD/RB7* <>…

【二分-BM19 寻找峰值】

题目 BM19 寻找峰值 描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 分析 对一个左闭右闭的区间二分&#xff0c;通过改变l 或r 的值将原始查找区间缩小一半…

【HarmonyOS NEXT星河版开发实战】页面跳转

个人主页→VON 收录专栏→鸿蒙综合案例开发​​​​​ 代码及其图片资源会发布于gitee上面&#xff08;已发布&#xff09; gitee地址https://gitee.com/wang-xin-jie234 目录 前言 界面功能介绍 界面构建过程 知识点概述 页面跳转 页面传参 全套源代码 Index页面 Sec…

API 的多版本管理,如何在 Apifox 中操作?

开放 API 是技术团队向外部提供服务和数据的关键手段。随着业务的发展和技术的更新&#xff0c;API 也需要不断进行版本迭代。这种迭代通常是为了满足市场需求&#xff0c;优化现有功能&#xff0c;增加新特性&#xff0c;或者修复漏洞。 在多个版本共存的情况下&#xff0c;团…

pikachu靶场----ssrf实现

目录 ssrf简介 SSRF&#xff08;curl&#xff09; 1.后端代码分析 2.http协议连接本地文件 3.file协议读取C盘中的文件。 4.dict协议扫描内网其他主机的端口开放情况 5.使用burp扫描内网其他主机的端口开放情况 ssrf简介 SSRF(Server-Side Request Forgery:服务器端请求…