Vue3 异步组件 suspense

news/2024/12/29 8:45:46/

 vue在解析我们的组件时, 是通过打包成一个 js 文件,当我们的一个组件 引入过多子组件是,页面的首屏加载时间 由最后一个组件决定 优化的一种方式就是采用异步组件 ,先给慢的组件一个提示语或者 骨架屏 ,内容回来在显示内容

结合elementui 使用

代码  

<template><div class="layout"><h1>suspense</h1><Suspense><template #default><sus></sus></template><template #fallback><copyVue/></template></Suspense></div>
</template>
<script lang="ts" setup>
import { defineAsyncComponent } from "vue";
import copyVue from "./sus/copy.vue";
let sus = defineAsyncComponent(() => import("./sus/index.vue"));
</script>
<style scoped lang="scss">$bg:#ccc;.layout{width: 800px;height: 400px;background-color: $bg;margin: auto;}
</style>

引入  defineAsyncComponent   定义异步组件 ,这个api 接收 一个 一个函数 ,函数返回值 为 需要 后来显示的组件  , copyVue 为预先显示的组件 或者自定义内容 

 <Suspense><template #default><sus></sus></template><template #fallback><copyVue/></template></Suspense>

使用 suspense  内置组件 在该组件内 使用 命名插槽 官方 定义的   

  #default  放后来显示的组件

 #fallback  放置 预先显示的内容

要想组件变成异步 组件 可以使用 顶层 await 技术  即 不用再 async 函数内使用 那个该组件就变成 异步组件

代码

<template><div class="sus"><img class="img" :src="res.url" alt=""><h1 class="posi">{{res.name }}</h1><h1 class="posi">{{ res.des }}</h1></div>
</template>
<script lang="ts" setup>
import axios from 'axios'
import './com.scss'
let fn = ()=>{return new Promise(  (resolve,reject)=>{setTimeout(async() => {resolve(axios.get('/data.json'))}, 2000);})}let {data:{data:res}}:any =  await   fn()console.log(res);
</script>
<style scoped lang='scss'>.sus{width: 100%;height: 200px;background-color: #999;
}</style>

copyvue

<template><div  v-loading="loading" element-loading-text="加载中..." element-loading-background="rgba(122, 122, 122, 0.8)" class="sus"></div>
</template>
<script lang="ts" setup>
import axios from 'axios'
import { ref } from 'vue'
const loading = ref(true)
</script>
<style scoped lang='scss'>
.sus{width: 100%;height: 200px;
}</style>

scss

.posi{height: 50px;background-color: rgb(209, 136, 136);margin-top: 20px;}.img{width: 30px;height: 30px;background-color: rgb(113, 52, 52);}

 public 下的 data.json 

{"data":{"name":"你好世界","url":"./favicon.ico","des":"世界是个荒原"}
}

public 下的  内容 回当成 服务的  '/xxx' 请求路径  get可以请求 到文件内容

http://localhost:5173/data.json


  


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

相关文章

亚马逊云科技 Build On - 咖啡厅Demo学习stepfunction serverless应用

荣幸参与和csdn和aws联合举办的buildon实验活动&#xff0c;主要目的还是学习stepfucntion的使用&#xff0c;这个服务能够集成大量aws service感觉可以出现很多有趣的用法。官方给出的文档已经非常详细了&#xff0c;这里只是对一些比较难理解的点进行了记录和解释&#xff0c…

vue + nodejs + npm

node.js下载 1、如图所示&#xff1a; 2、建立node_cache、node_global文件夹&#xff1a; 然后运行以下2条命令 npm config set prefix “D:\node-v14.15.0-win-x64\node_global” npm config set cache “D:\node-v14.15.0-win-x64\node_cache” 执行npm list -global查看&…

如何实现带动画的动态面包屑,来看看?

大家好&#xff0c;我是派大星&#xff0c;最近在自己手动搭建一个后台管理平台&#xff0c;将其命名为 “雷达行动 Radar-Solution” &#xff0c;在开发的过程中对比了一下其他已经成型的后台解决方案&#xff0c;发现都存在一个共性&#xff0c;就是在Layout的头部都有一个面…

【实时数仓】DWS层之关键词主题表(FlinkSQL)、数据可视化接口、Sugar数据大屏、总成交金额接口实现

文章目录一 DWS层-关键词主题表(FlinkSQL)1 过滤数据2 利用UDTF进行拆分&#xff08;1&#xff09;拆分结果&#xff08;2&#xff09;Join 表函数 (UDTF)&#xff08;3&#xff09;代码3 分组、开窗、聚合计算4 转换为流并写入ClickHouse&#xff08;1&#xff09;在ClickHous…

设计模式分类及六大原则

一、设计模式的分类 创建型模式&#xff1a; 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式&#xff1a; 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式行为模式&#xff1a; 策略模式、模板方法模式、观察者模式、责…

【leetcode】最大数

一、题目描述 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 示例 1&#xff1a; 输入&#xff1a;nums …

管理员权限功能和开机自启功能

前言 开机启动功能在Window下是很重要的一个功能&#xff0c;很多程序它都需要这样的功能 一.VS的配置选项&#xff08;以管理员权限启动程序&#xff09; 作用&#xff1a;用户在点击任务栏窗口等需要管理员权限时不会没有响应。 二.开机自启动&#xff08;注册表&#xff…

【Educoder作业】CC++文件实训

【Educoder作业】C&C文件实训 拖了很久了&#xff0c;主要是当时没有完全理解 整个文件实训和之前的区别就在于&#xff0c;处理问题的时候我们的数据是存到了文件里或者我们希望把输出放到文件里。所以只需要解决文件输入和文件输出的问题即可。四个关卡相当于不同的手段&…