当前位置: 首页 > news >正文

在 Vue 3 中全局使用 Suspense 组件

Suspense 是 Vue 3 引入的一个内置组件,不需要引用可以直接用。用于处理异步依赖的等待状态。虽然 Suspense 主要用于异步组件,但你也可以全局地使用它来管理整个应用的加载状态。

全局 Suspense 的基本用法

1. 在根组件中使用 Suspense

// main.js 或 main.ts
import { createApp } from 'vue'
import App from './App.vue'createApp(App).mount('#app')
<!-- App.vue -->
<template><Suspense><router-view /><template #fallback><div class="loading-indicator">加载中...</div></template></Suspense>
</template><script>
export default {name: 'App'
}
</script><style>
.loading-indicator {display: flex;justify-content: center;align-items: center;height: 100vh;font-size: 1.5rem;
}
</style>

2. 结合异步组件使用

// 路由配置示例 (router.js)
import { createRouter, createWebHistory } from 'vue-router'const Home = () => ({component: import('./views/Home.vue'),loading: LoadingComponent,  // 可选error: ErrorComponent,      // 可选delay: 200,                // 延迟显示加载组件timeout: 3000              // 超时时间
})const routes = [{ path: '/', component: Home }
]const router = createRouter({history: createWebHistory(),routes
})export default router

高级全局 Suspense 实现

1. 创建全局加载状态管理

javascript

// stores/loading.js (使用Pinia)
import { defineStore } from 'pinia'export const useLoadingStore = defineStore('loading', {state: () => ({isLoading: false,message: '加载中...'}),actions: {startLoading(message) {this.isLoading = truethis.message = message || '加载中...'},stopLoading() {this.isLoading = false}}
})

2. 创建全局 Suspense 组件

vue

<!-- components/GlobalSuspense.vue -->
<template><Suspense @pending="onPending" @resolve="onResolve" @fallback="onFallback"><slot /><template #fallback><div v-if="isLoading" class="global-loading"><div class="spinner"></div><p>{{ message }}</p></div></template></Suspense>
</template><script setup>
import { useLoadingStore } from '@/stores/loading'const loadingStore = useLoadingStore()
const { isLoading, message } = storeToRefs(loadingStore)const onPending = () => {loadingStore.startLoading()
}const onResolve = () => {loadingStore.stopLoading()
}const onFallback = () => {// 可以添加额外的回调逻辑
}
</script><style>
.global-loading {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background: rgba(255, 255, 255, 0.8);display: flex;flex-direction: column;justify-content: center;align-items: center;z-index: 9999;
}.spinner {border: 4px solid #f3f3f3;border-top: 4px solid #3498db;border-radius: 50%;width: 40px;height: 40px;animation: spin 1s linear infinite;
}@keyframes spin {0% { transform: rotate(0deg); }100% { transform: rotate(360deg); }
}
</style>

3. 在应用中使用全局 Suspense

vue

<!-- App.vue -->
<template><GlobalSuspense><router-view /></GlobalSuspense>
</template><script setup>
import GlobalSuspense from '@/components/GlobalSuspense.vue'
</script>

注意事项

  1. 错误处理:Suspense 本身不处理错误,需要使用 onErrorCaptured 或 errorCaptured 钩子

  2. 嵌套 Suspense:可以嵌套使用 Suspense,内层 Suspense 会优先于外层

  3. SSR 兼容:在服务端渲染时 Suspense 行为有所不同

  4. 组合式 API:在 setup 中使用 async 时,组件会自动成为 Suspense 的异步依赖

错误处理示例

vue

<template><Suspense><template #default><AsyncComponent /></template><template #fallback><div>Loading...</div></template></Suspense>
</template><script setup>
import { onErrorCaptured } from 'vue'
import AsyncComponent from './AsyncComponent.vue'onErrorCaptured((error) => {console.error('Error caught by Suspense:', error)// 可以在这里显示错误界面return false // 阻止错误继续向上传播
})
</script>

通过这种方式,你可以在整个 Vue 3 应用中实现统一的加载状态管理和优雅的异步处理体验。

http://www.dtcms.com/a/266816.html

相关文章:

  • 【内存】Linux 内核优化实战 - kernel.numa_balancing
  • [Linux]内核态与用户态详解
  • 1.1_3_2 三种交换方式的性能分析
  • PHP从字符串到数值的类型转换
  • 后端密码加密:守护用户数据的钢铁长城
  • 第三章 基于rtthread标准库的串口和shell应用
  • vue 循环无限滚动表格
  • 用distance_transform 检测线性凸包
  • Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
  • 双因子认证(2FA)是什么?从零设计一个安全的双因子登录接口
  • Linux-进程概念(3)
  • 在HP暗影精灵Ubuntu20.04上修复IntelAX211Wi-Fi不可用的全过程记录——系统安装以后没有WIFI图标无法使用无线网
  • RabbitMQ 高级特性之 TTL
  • Spring Boot 应用启动时,端口 8080 已被其他进程占用,怎么办
  • 物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
  • 【Spring Boot】HikariCP 与 Druid 连接池全面对比
  • OpenCV中超分辨率(Super Resolution)模块类cv::dnn_superres::DnnSuperResImpl
  • 数字工厂的核心引擎:物联网驱动生产智能化升级
  • 前端查询条件加密传输方案(SM2加解密)
  • Flink SQLServer CDC 环境配置与验证
  • vue3 el-table 行筛选 设置为单选
  • Oreacle(SQL语言基础)
  • 【问题解决】VSCode终端中看不到Git-Bash
  • XILINX Kintex 7系列FPGA的全局时钟缓冲器(BUFG)和区域时钟缓冲器(BUFR/BUFH)的区别
  • 【PyTorch】PyTorch预训练模型缓存位置迁移,也可拓展应用于其他文件的迁移
  • HTTP协议利用TCP的特性来实现长连接
  • Compose笔记(三十)--图片选择器
  • 【Spring Boot】HikariCP 连接池 YAML 配置详解
  • 洛谷P1941 [NOIP 2014 提高组] 飞扬的小鸟
  • vue3 获取选中的el-table行数据