Vue 3新引入的Suspense组件介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 3新引入的Suspense组件介绍相关的知识,希望对你有一定的参考价值。

参考技术A Suspense是Vue 3新增的内置标签,尽管目前官方文档里并没有Suspense的介绍,但不妨碍我们先学习它。

每当我们希望组件等待数据获取时(通常在异步API调用中),我们都可以使用Vue3 Composition API制作异步组件。

以下是异步组件有用的一些实例:

以前,在Vue 2中,我们必须使用条件(例如 v-if 或 v-else)来检查我们的数据是否已加载并显示后备内容。

但是现在,Suspense随Vue3内置了,因此我们不必担心跟踪何时加载数据并呈现相应的内容。

我们通过范例学习Suspense,首先编写一个父组件。

<template>里使用了<Suspense>标签,即便你完全不懂<Suspense>的用法,看了范例也该看明白,default插槽里要放正式内容,fallback插槽里要放降级内容,我放了一行字 Loading ... ,你也可以放菊花图之类的东西。

变量名asyncCom必须与模板里的组件名一致。defineAsyncComponent方法用来动态引入组件。

页面会显示1.5秒的Loading...,然后显示一个列表。

Vue从上到下执行子组件的setup里的全部语句,执行完同步语句(包括await语句)之后,父组件就认为子组件加载完成,在这之前,子组件setup状态始终未pending,所以父组件显示降级内容(Loading...),等子组件setup的状态变成resolved或者rejected,父组件就显示默认内容。

先说怎么显示异常:我的计划是,如果出现异常,就不再显示Loading...,而是显示“Loading Error. Retry?”,其中Retry做成一个按钮。

现在 ref: jsonData = await fetchData(); 这句根本没有考虑异常情况,那么怎么捕获异常呢?

我们定义一个布尔值asyncComShow负责刷新组件,同时给<async-com>绑上事件@retry="retry"。retry函数要做的事情就是隐藏组件然后再显示,借此刷新组件。

首先编写错误提示,然后定义变量errorShow来切换提示。

const instance = getCurrentInstance();用于提供emit方法向父组件发出retry申请。也可以在顶层定义const context = useContext();,然后用context.emit("retry");,我建议用后者,因为标准且轻量级。

之后,我们用try...catch...来捕获错误。

最后,await getList()的await是必须要写的,不然setup生命期会在瞬间结束,Loading提示也只会显示一瞬间。

以上是关于Vue 3新引入的Suspense组件介绍的主要内容,如果未能解决你的问题,请参考以下文章

vue3中的Suspense(不确定的)

React自定义组件之懒加载-LazyLoad。

React.lazy和Suspense组合实现组件懒加载

vue3.0都有哪些新特性

Vue2与Vue3的区别

vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?