一、简述
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>
每天进步一点点