• Vue3——Suspense组件


    Suspense组件

    官网中有提到他是属于实验性功能:
    是一项实验性功能。它不一定会最终成为稳定功能,并且在稳定之前相关 API 也可能会发生变化。
    是一个内置组件,用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成,并可以在等待时渲染一个加载状态。

    意思就是此组件用来等待异步组件时渲染一些额外内容,让应用有更好的用户体验

    要了解 所解决的问题和它是如何与异步依赖进行交互的,我们需要想象这样一种组件层级结构:

    
    └─ 
       ├─ 
       │  └─ (组件有异步的 setup())
       └─ 
          ├─  (异步组件)
          └─ (异步组件)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这个组件树中有多个嵌套组件,要渲染出它们,首先得解析一些异步资源。如果没有 ,则它们每个都需要处理自己的加载、报错和完成状态。在最坏的情况下,我们可能会在页面上看到三个旋转的加载态,在不同的时间显示出内容。

    有了 组件后,我们就可以在等待整个多层级组件树中的各个异步依赖获取结果时,在顶层展示出加载中或加载失败的状态。
    接下来看个简单的例子:
    首先需要引入异步组件

    import {defineAsyncComponent} from 'vue'
    const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
    
    • 1
    • 2

    简洁一些就是用组件实现异步的加载的这么一个效果
    Home父组件代码如下:

    <template>
      <div class="home">
        <h3>我是Home组件h3>
        <Suspense>
           <template #default>
            <Child />
          template>
          <template v-slot:fallback>
            <h3>Loading...h3>
          template>
        Suspense>
      div>
    template>
     
    <script >
    // import Child from './components/Child'//静态引入
    import { defineAsyncComponent  } from "vue";
    const Child = defineAsyncComponent(() => import("../components/Child"));
    export default {
      name: "",
      components: { Child },
    };
    script>
     
    <style>
    .home {
      width: 300px;
      background-color: gray;
      padding: 10px;
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    自组件Child

    <template>
      <div class="child">
        <h3>我是Child组件h3>
        name: {{user.name}}
        age: {{user.age}}
      div>
    template>
    
    <script>
    import { ref } from "vue";
    export default {
      name: "Child",
      async setup() {
        const NanUser = () => {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              resolve({
                name: "NanChen",
                age: 20,
              });
            },2000);
          });
        };
        const user = await NanUser();
        return {
          user,
        };
      },
    };
    script>
    
    <style>
    .child {
      background-color: skyblue;
      padding: 10px;
    }
    style>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    根据插槽机制,来区分组件, #default 插槽里面的内容就是你需要渲染的异步组件; #fallback 就是你指定的加载中的静态组件。


    效果如下:
    请添加图片描述

  • 相关阅读:
    一块GPU搞定ChatGPT;ML系统入坑指南;理解GPU底层架构
    【Python】sort 排序
    大语言模型学习笔记-1
    vue-element-admin 综合开发五:引入 echarts,封装echarts 组件
    MindSponge分子动力学模拟——使用MDAnalysis工具进行后分析(2024.02)
    Java数据结构——应用DFS算法计算流程图下游节点(1)
    Windows10快捷键合集
    StoryDALL-E复现(基于预训练文本到图像Transformer的故事续编)
    如何通过定时重启来优化阿里云幻兽帕鲁/Palworld的多人联机性能,并避免内存溢出导致的异常退出游戏?
    Qt部署MQTT
  • 原文地址:https://blog.csdn.net/nanchen_J/article/details/126462992