55 多页签数据状态管理 - udo-bit/naive_admin_pro GitHub Wiki
首先我们需要创建一个组合式api的方法,用来管理我们的状态信息。
在composable下创建一个multi-tab-state.ts的文件。
我们状态管理还是采用和菜单一样的管理方式,使用依赖注入的方式,之前我们依赖注入采用的是vueuse提供给我们的方法,这次我们就不采用他给我们提供的方法进行依赖注入了,我们自己来实现一下。
首先我们先来创建一个方法如下:
export const useMultiTabProvider = () => {
const state = reactive({
// tab列表
tabList: [],
// 选中的数据
current: '',
})
// 返回选中的状态信息
return state
}
在这里我们就需要将我们的状态信息进行依赖注入,那么我们怎么进行依赖注入呢。
在vue中给我们提供了provider的方法,第一个参数可以是一个字符串也可以是一个Symbol类型,我们这里为了保证key的唯一性,我们就需要使用Symbol类型进行处理。
首先我们在layouts中的multi-tab中创建一个type.ts的文件。
为了方便我们后续开发,我们最好给我们的依赖注入定义一些类型。在vue中也给我提供了相应的助手类型。
import type { InjectionKey } from 'vue'
import type { RouteLocationNormalized } from 'vue-router'
export interface TabItem {
// 路由地址
path: string
// 显示的名称
tabTitle?: string
// 存储路由信息
route: Omit<RouteLocationNormalized, 'matched'>
}
export interface MultiTabStore {
tabList: TabItem[]
current: string
}
// 其中接收一个泛型,我们把我们自己定义的类型给他传入进去
export const MULTI_TAB_STORE_KEY: InjectionKey<MultiTabStore> = Symbol('multi-tab')
我们既然有了provider方法给我们提供状态管理,那么我们是不是还需要一个获取状态的方法,在vue中还给我们提供了一个方法叫inject方法,用于获取我们注入到子组件的数据。
export const useMultiTabInject = () => {
// 给他加一个!我们确定是一定有值的
return inject(MULTI_TAB_STORE_KEY)!
}
最后我们在App.vue中进行进行注入
const appStore = useAppStore()
const { layoutTheme, overridesTheme } = storeToRefs(appStore)
useAutoDark()
const { naiveLocale } = useAutoLang()
useMenuStateProvider()
useMultiTabProvider()
然后我们在multi-tab中引入我们获取数据状态的api
<script lang="ts" setup>
const state = useMultiTabInject()
console.log(state)
</script>
刷新页面,测试能不能正常拿到数据。