Vue3应用——关于suspense

1,943 阅读3分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

关于suspense

create by db on 2021-10-20 19:00:36
Recently revised in 2021-10-20 19:43:41

闲时要有吃紧的心思,忙时要有悠闲的趣味

目录

前言

返回目录

  Vue3 增加了很多让人眼前一亮的特征,suspense 组件就是其中之一,关于 suspense,可以先看一下官网介绍Vue. suspense

  suspense 对处理异步请求数据非常实用,可以简化异步请求UI的处理逻辑。 下面我们一起来看一下它是怎么使用的。

suspense 是一个试验性的新特性,其 API 可能随时会发生变动。特此声明,以便社区能够为当前的实现提供反馈。生产环境请勿使用。

一、suspense介绍及使用场景

返回目录

  通常组件在正确呈现之前需要执行某种异步请求是很常见的, 例如,从一个 API 异步获取数据,并希望在获取响应数据解析完时显示一些信息,如 loading 效果。在Vue3中可以使用 suspense 组件很简单的实现这样的需求。

二、suspense的用法

返回目录

  话不多说,我们看一下在项目中应该如何使用suspense组件。比如我们需要在接口中获取七日天气预报,而在取到数据之前需要展示 数据加载中…… de

  1. 创建异步组件

  创建一个天气组件 WeatherForecast.vue ,我们在该组件中使用 fetch发起 HTTP 请求,通过异步 API http://www.tianqiapi.com/api 调用获取天气数据,然后展示到页面中。

其组代码如下:

<template>
  <h4>{{weatherData.city}}</h4>
  <div v-for="(weather, index) in weatherData.data"
    :key="index">
    日期:{{ weather.date }}
    天气:{{ weather.wea_day }}
  </div>
</template>
<script>
import { ref } from "vue";
export default {
  name: "WeatherForecast",
  async setup() {
    const weatherData = ref(null);
    const headers = { "Content-Type": "application/json" };
    // 在 `setup` 内部使用 `await` 需要非常小心
    // 因为大多数组合式 API 函数只会在
    // 第一个 `await` 之前工作
    const fetchweatherData = await fetch("http://www.tianqiapi.com/api?version=v9&appid=23035354&appsecret=8YvlPNrz", {
      headers,
    });
    weatherData.value = await fetchweatherData.json();
    return { weatherData };
  },
};
</script>
  1. 使用 suspense 显示数据加载中的信息
  • 创建一个父组件 WeatherForec.vue, 引入子组件WeatherForecast.vue

  • 使用 <Suspense></Suspense>包裹所有异步组件相关代码

  • <Suspense></Suspense> <template #default></template> 插槽包裹异步组件

  • <Suspense></Suspense> <template #fallback></template> 插槽包裹渲染异步组件之前的内容

其代码如下:

<template>
  <div>
    <h1>七日天气预报</h1>
  </div>
  <!-- <suspense> 组件有两个插槽。它们都只接收一个直接子节点。
    default 插槽里的节点会尽可能展示出来。
    如果不能,则展示 fallback 插槽里的节点。 -->
  <suspense>
    <template #default>
      <WeatherForecast />
    </template>
    <template #fallback>
      <h3>数据加载中……</h3>
    </template>
  </suspense>
</template>
<script>
import WeatherForecast from "@/components/WeatherForecast.vue";
export default {
  name: "App",
  components: {
    WeatherForecast
  },
};
</script>

  从上面的代码片段中,使用组件 suspense 可以很简单就实现了 loading 的效果,带有 #default 为初始化模板组件,显示异步请求完成之后的 UI 。带有 #fallback 为异步请求中的处理 UI ,即常见的 loading 效果。

与诸君共勉,为自己加油!

参考文档

后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址

文档协议


db 的文档库db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。