Vue3中Suspense的使用

Vue3中Suspense的使用

前言

当我们在项目中遇到异步组件加载的时的loading状态的时候,一般情况下用v-if搭配loading变量,例如

vue 复制代码
<template>
    <h2>我是Child组件</h2>
    <div v-if="loading">加载中。。。</div>
    <div v-else>{{ data }}</div>
</template>
<script setup>
import axios from 'axios';
import { ref, onMounted } from 'vue';
const data = ref(null)
const loading = ref(true)
onMounted(async () => {
    try {
        const res = await axios.get('https://v2.xxapi.cn/api/yiyan?type=hitokoto');
        // 假设返回的数据结构是 { data: "一句诗" } 或其他
        data.value = res.data.data;
        console.log(data.value);
    } catch (error) {
        console.error('请求失败:', error);
        data.value = '加载失败,请稍后重试';
    } finally {
        loading.value = false;  // 无论成功或失败,都结束加载状态
    }
})
</script>

<style scoped></style>

没有感觉这样写很复杂吗?这样是不是我们每个组件都得这么写呢?如果父组件依赖子组件得异步数据,父组件是不是一直要等待子组件加载完毕才能渲染呢?像我们上面写的,是不是完全由子组件控制得,父组件完全没有感知呢?

  • Suspense就是解决这种问题的,它允许我们在组件树的任意层级等待异步依赖,并且在等待期间现实统一的fallback内容,直到所有的依赖全部完成,所以上面的我们就可以这么写
vue 复制代码
//父组件
<template>
  <h2>我是APP组件</h2>
  <Suspense>
    <template v-slot:default>
      <Child />
    </template>
    <template v-slot:fallback>
      <h2>正在加载中......</h2>
    </template>
  </Suspense>

</template>
<script setup>
import { teleportProps } from 'element-plus/es/components/teleport/index.mjs';
import Child from './Child.vue';


</script>

<style scoped></style>

//子组件
<template>
    <h2>我是Child组件</h2>
    <div>{{ data }}</div>
</template>
<script setup>
import axios from 'axios';
import { ref, onMounted } from 'vue';
const data = ref(null)
const loading = ref(true)

const res = await axios.get('https://v2.xxapi.cn/api/yiyan?type=hitokoto');
data.value = res.data.data;

</script>

<style scoped></style>

Suspense是使用插槽来实现的,其中default是你实际要渲染的东西,其中可能包括异步依赖等等;fallback是异步加载之前需要现实的内容

注:如果你在 default 插槽中写了多个根节点(如多个组件并列),Vue 会警告并要求你用一个包裹元素。所以通常用一个 <div> 包裹。

相关推荐
To_OC9 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn9 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker9 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜10 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
随心点儿10 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
一点一木11 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒12 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
kyriewen12 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
遇乐的果园12 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习