根节点
uniapp 中并没有web端类似的根节点,项目引入了 @uni-ku/root 插件来实现全局根节点官方文档
插件在 vite.config.ts 中注册(UniKuRoot,rootFileName: "AppRoot"),它更像是将根节点中定义的内容编译到了各个组件中,使用时应避免从根节点处理过重的任务
全局逻辑放哪里
应用级全局逻辑(主题初始化、WebSocket 消息监听、H5 补验守卫等)应放在 App.vue 的 onLaunch 中接线——App.vue 的生命周期是整个应用级别的,只触发一次;而 AppRoot.vue 是组件级根节点,每次页面跳转都会重建。两者职责不要混淆。
组件
根节点位于项目 src/AppRoot.vue,里面定义的模版可应用到各个组件中,项目中将sard-uniapp需要的代理组件与全局轻量通知组件都放置在根节点,业务中需要时直接调用ts api即可
<template>
<view>
<KuRootView />
<!-- 通知代理组件 -->
<sar-notify-agent />
<!-- 模态框代理组件 -->
<sar-dialog-agent />
<!-- 裁剪组件代理 -->
<sar-crop-image-agent />
<!-- 轻量通知组件 -->
<notice-lite v-model="noticeLiteVisible" :notice-id="noticeId"/>
</view>
</template>根节点通过 defineExpose 暴露了 showNoticeLite(id) 方法,供全局打开轻量通知抽屉(原生通知横幅下滑即是调用它)。
生命周期
不要将 uni-ku/root 的生命周期与 App.vue 的生命周期混淆。 App.vue 的生命周期对应的是整个应用级别,只会在应用启动、前后台切换等场景触发。 而 uni-ku/root 本质上是一个组件,其生命周期与组件实例的存在保持一致:每次页面跳转时,根节点组件都会被重新创建,从而触发其完整的生命周期流程。 根节点生命周期先于页面执行,避免在根节点中处理复杂逻辑。
执行顺序 来自官网
- 根组件的 onLaunch / created
- 根组件的 onLoad
- 页面组件的 onLoad
- 根组件的 onShow
- 页面组件的 onShow
- 根组件的 onReady
- 页面组件的 onReady
AppRoot 的 onShow 中会重设 tabBar 红点(noticeStore.setTabbarRedDot()),补偿 uni.showTabBarRedDot 仅在 tabBar 页面生效的平台限制。
获取根节点实例
根节点实例保存在了rootStore中,使用方法与其他store一致
// 引入 useRootRefStore
import {useRootRefStore} from "@/stores/root"
// 获取rootRefStore实例
const rootRefStore = useRootRefStore()
// 调用根节点中 defineExpose 的方法
const ref = rootRefStore.getRootRef()
