关键词: Vue 3、Suspense、异步组件、loading 状态、Composition API、组件懒加载、小红书技术博主、前端开发、组件通信、代码示例


哈喽姐妹们👋~
今天来和大家分享一个 Vue 3 中超实用但容易被忽视的内置组件 —— Suspense

你是不是也遇到过这样的问题:

“我用 defineAsyncComponent 异步加载组件时,页面白屏/卡顿,用户体验差?”

别担心!Vue 3 的 Suspense 就是为了解决这个问题而生的——它让你可以优雅地展示“加载中”状态,甚至还能嵌套使用,让整个页面的异步体验丝滑流畅!

🎯本篇文章将从基础讲起,结合真实项目中最常用的场景(如异步组件加载、API 数据请求),附上完整代码讲解,保证你一看就会!


💡什么是 Suspense?

Suspense 是 Vue 3 Composition API 中新增的一个内置组件,用于在组件树中等待异步依赖项(比如异步组件、Promise)完成前显示备用内容(比如 loading 动画)。

通俗点说就是:“等一等再渲染,先给你看个 Loading!”

🔧基本语法:

<template>
  <Suspense>
    <!-- 异步组件 -->
    <template #default>
      <AsyncComponent />
    </template>

    <!-- 加载中内容 -->
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>
  • #default 插槽:需要等待的内容(异步组件或 Promise)
  • #fallback 插槽:等待期间显示的内容(loading 动画、文字提示等)

🚀实战案例:异步加载组件 + 接口数据请求

🎯功能需求:

  • 使用 defineAsyncComponent 异步加载组件
  • 在加载过程中显示 loading 提示
  • 支持多个异步组件同时加载
  • 支持接口数据异步加载并配合 Suspense 使用

📦1. 异步组件定义(components/AsyncUserCard.vue)

// components/AsyncUserCard.vue
export default {
  setup() {
    return () => (
      <div class="user-card">
        <h2>用户信息已加载</h2>
        <p>姓名:张三</p>
        <p>邮箱:zhangsan@example.com</p>
      </div>
    )
  }
}

📦2. 主页面使用 Suspense(App.vue)

<template>
  <div class="app">
    <h1>欢迎来到我的主页</h1>

    <Suspense>
      <!-- 默认插槽:异步组件 -->
      <template #default>
        <AsyncUserCard />
      </template>

      <!-- fallback 插槽:加载中状态 -->
      <template #fallback>
        <div class="loading">⏳ 正在加载用户信息...</div>
      </template>
    </Suspense>
  </div>
</template>

<script setup>
import { defineAsyncComponent } from 'vue'

const AsyncUserCard = defineAsyncComponent(() =>
  import('./components/AsyncUserCard.vue')
)
</script>

<style scoped>
.app {
  padding: 20px;
}
.loading {
  font-size: 18px;
  color: #666;
}
</style>

🌈进阶技巧:结合 API 请求使用 Suspense

除了异步组件,你还可以直接在 <Suspense> 中使用 Promise,例如调用接口获取数据。

📦1. 定义一个异步数据加载组件(components/UserDataLoader.vue)

<template>
  <div v-if="data" class="user-data">
    <h3>用户详情:</h3>
    <p>用户名:{{ data.name }}</p>
    <p>邮箱:{{ data.email }}</p>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'

const data = ref(null)

onMounted(async () => {
  const res = await fetch('https://jsonplaceholder.typicode.com/users/1')
  data.value = await res.json()
})
</script>

<style scoped>
.user-data {
  margin-top: 10px;
  background: #f9f9f9;
  padding: 15px;
  border-radius: 5px;
}
</style>

📦2. 在主页面中使用(App.vue)

<template>
  <div class="app">
    <h1>用户中心</h1>

    <Suspense>
      <template #default>
        <UserDataLoader />
      </template>
      <template #fallback>
        <div class="loading">🌀 正在加载用户数据...</div>
      </template>
    </Suspense>
  </div>
</template>

<script setup>
import UserDataLoader from './components/UserDataLoader.vue'
</script>

🧠总结一下

技术点 是否掌握
Suspense 基本用法
异步组件加载 ✅✅
结合 API 数据请求 ✅✅
fallback 插槽自定义 ✅✅✅
多个异步组件嵌套使用

📣写在最后

Suspense 是 Vue 3 中非常实用又强大的内置组件,能极大提升用户体验和页面响应速度。无论是做后台系统、移动端应用还是组件库封装,都是必备技能!

如果你觉得这篇笔记对你有帮助,记得点赞+收藏+转发哦 ❤️
有问题欢迎留言交流,咱们一起进步!


📌 关注我,解锁更多 Vue 3 高级玩法 & 实战案例!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐