Vue2/3中异步加载子组件

news/2024/11/29 4:37:39/

Vue2/3中异步加载子组件

场景

基于vue的前端开发中,在app.vue中,有一个子组件feedback,它需要在用户登录接口响应状态码200后,才会异步加载feedback并挂载,否则其他情况下则不加载feedback组件,如何实现。

Vue2

v-if + 懒加载实现

使用v-if指令来实现在用户登录后异步加载feedback组件的功能。以下是示例代码:

<template><div><div v-if="loggedIn"><async-feedback></async-feedback></div></div>
</template><script>export default {data() {return {loggedIn: false}},created() {// 假设用户登录接口返回的响应状态码为200// 在此处替换为实际使用的代码setTimeout(()=>{this.loggedIn = true}, 2000)},components: {// 这个 `import` 函数会返回一个 `Promise` 对象。'async-feedback': () => import('./AsyncFeedback.vue')}}
</script>

在上面的代码中,我们使用了v-if指令来根据用户是否登录来决定是否渲染AsyncFeedback组件。在created钩子函数中,我们假设用户登录接口返回的响应状态码为200,然后将loggedIn数据属性设置为true。这将导致v-if指令将AsyncFeedback组件渲染到DOM中。

component + 懒加载实现

使用<component :is="...">语法来延迟加载组件,以提高应用程序的性能。使用这种方式可以在需要时才加载组件,而不是在应用程序启动时立即加载所有组件。

// 需要等待登录后再加载的组件
Vue.component('feedback', () => import('components/feedback/index.vue'))// 第二步
<component :is="rightBottomCom"></component>// 第三步rightBottomCom(){return this.loggedIn ? 'feedback' : ''
}

高级异步组件

  <script type="text/javascript">// 注册组件var resCom = {template: "#async-example"};var promise = new Promise(function(resolve, reject){setTimeout(function(){resolve(resCom)}, 2000);});var LoadingComponent = {template: '<div>加载中显示的组件</div>'};var ErrorComponent = {template: '<div>异步组件加载失败</div>'};// Vue.component('async-example', function(resolve, reject){//   setTimeout(function(){//     // 向resolve回调传递组件定义//     resolve(resCom);//   }, 1000);// });const AsyncComponent = function(){return {// 需要加载的组件 (应该是一个 `Promise` 对象)component: promise,// 异步组件加载时使用的组件loading: LoadingComponent,// 加载失败时使用的组件error: ErrorComponent,// 展示加载时组件的延时时间。默认值是 200 (毫秒)delay: 200,// 如果提供了超时时间且组件加载也超时了,// 则使用加载失败时使用的组件。默认值是:`Infinity`// PS: 组件加载超时时间,超时表示加载失败,会展示ErrorComponent。// 比如在这里当我们把 Promise 中的 setTimeout 改为 4000的时候,则会展示 ErrorComponenttimeout: 3000}}var vm = new Vue({el: "#app",// 注意这里与之前的写法不同之处,是因为我们把这个方法提出去赋值给了AsyncComponent的变量components:{'async-example': AsyncComponent}})</script> 

Vue3

Suspense组件和defineAsyncComponent函数

<template><div><Suspense><template #default><div v-if="loggedIn"><AsyncFeedback /></div></template><template #fallback><!-- 加载指示器 --></template></Suspense></div>
</template><script>import { defineAsyncComponent, ref } from 'vue'const AsyncFeedback = defineAsyncComponent(() => import('./AsyncFeedback.vue'))export default {setup() {const loggedIn = ref(false)// 模拟用户登录接口响应setTimeout(() => {loggedIn.value = true}, 2000)return { loggedIn, AsyncFeedback }}}
</script>

参考:https://blog.csdn.net/CRMEB/article/details/112516876


http://www.ppmy.cn/news/39703.html

相关文章

2023年全国最新高校辅导员精选真题及答案45

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 14.人的亲和行为会受到外貌、距离、熟悉性和相似性等的影响。 答案&#xff1a;正确 16.…

收割offer疯狂涨了5K,自动化测试面试题整理大全,你能答上多少?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 自动化基础能力 软件…

ESP32设备驱动-VEML6070紫外光传感器驱动

VEML6070紫外光传感器驱动 1、VEML6070介绍 VEML6070 是一款先进的紫外 (UV) 光传感器,具有 I2C 协议接口,采用 CMOS 工艺设计。 它可以通过简单的 I2C 命令轻松操作。 具有阈值窗口设置的主动确认 (ACK) 功能 允许 UV 传感器发出 UVI 警报信息。 在强烈的太阳能 UVI 条件下…

设计模式之命令模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、命令模式是什么&#xff1f; 命令模式是一种行为型的软件设计模式&#xff0c;行为请求者通过发起命令&#xff0c;使得行为实…

侧滑菜单的简单使用

本节给大家带来基础UI控件部分的最后一个控件:DrawerLayout,官方给我们提供的一个侧滑菜单控件,和上一节的ViewPager一样,3.0以后引入,低版本使用它,需要v4兼容包,说到侧滑,相信很多人都用过github上的SlidingMenu,不过好像有两个版本,一个是单独的,另一个需要依赖另…

源码剖析JVM类加载机制

1 前言 我们平常开发中&#xff0c;都会部署开发的项目或者本地运行main函数之类的来启动程序&#xff0c;那么我们项目中的类是如何被加载到JVM的&#xff0c;加载的机制和实现是什么样的&#xff0c;本文给大家简单介绍下。 2 类加载运行全过程 当我们用java命令运行某个类…

【Go进阶】进程和线程、协程的区别

目录 1、进程和线程 2、并发和并行 3、协程 4、对比协程、线程和进程 1、进程和线程