一、简述

  Suspense 是 vue3 中新增的组件,类似于 keep-alive 不需要任何的引入,可以直接进行使用。自带两个 slot 分别为 default、fallback。当要加载的组件不满足状态时,Suspense 将回退到 fallback状态一直到加载的组件满足条件,才会进行渲染。Suspense在等待异步组件时额外渲染一些内容,使用户拥有更好的体验,比如说

  • 在页面加载之前显示加载动画
  • 显示占位符内容
  • 处理延迟加载的图像

  二、配合setup使用

    下边在父组件中引入子组件,在子组件未请求回数据时先加载loading,之后再展示列表

 1 parent.vue
 2 
 3 template>
 4   <div>
 5     <Suspense>
 6       <template #default>
 7         <Child />
 8       </template>
 9       <template #fallback>Loading ...</template>
10     </Suspense>
11   </div>
12 </template>
13 
14 <script setup>
15 import { defineAsyncComponent } from "vue";
16 //借助defineAsyncComponent动态引入
17 const Child = defineAsyncComponent(() => import("./child.vue"));
18 </script>
 1 child.vue
 2 
 3 <template>
 4   <div>
 5     <ul>
 6       <li v-for="item in jsonData" :key="item.name">
 7         {{ item.name }} - {{ item.age }}
 8       </li>
 9     </ul>
10   </div>
11 </template>
12 
13 <script setup>
14 import { ref } from "vue";
15 function fetchData() {
16   return new Promise((resolve) => {
17     setTimeout(() => {//模拟异步请求
18       resolve([
19         {
20           name: "张三",
21           age: 15,
22         },
23         {
24           name: "李四",
25           age: 17,
26         },
27       ]);
28     }, 1000);
29   });
30 }
31 
32 ref: jsonData = await fetchData();
33 </script>

 

  三、配合路由使用

   配合路由使用,当未加载完毕时不显示 router-view,而是渲染 fallback的 内容,全局增加 loading 的处理

 1 <router-link to="/home">Home</router-link>|
 2 <router-link to="/about">About</router-link>
 3 <Suspense>
 4   <template #default>
 5     <router-view />
 6   </template>
 7   <template #fallback>
 8     <div class="loading"></div>
 9   </template>
10 </Suspense>

 

posted on 2022-03-18 11:22  前端幼儿园_影啊翔  阅读(697)  评论(0编辑  收藏  举报