并未搞通,先抄为敬。
1 定义类型化的 InjectionKey。
// store.ts
import { InjectionKey } from 'vue'
import { createStore, Store } from 'vuex'
// 为 store state 声明类型
export interface State {
count: number
}
// 定义 injection key
export const key: InjectionKey<Store<State>> = Symbol()
export const store = createStore<State>({
state: {
count: 0
}
})
2将 store 安装到 Vue 应用时提供类型化的 InjectionKey
import { createApp } from 'vue'
import App from './App.vue'
import {store, key} from '@/store/store';
createApp(App).use(store, key).mount('#app')
3 组件使用时。
import { useStore } from 'vuex'
import { key } from './store'
export default {
setup () {
const store = useStore(key)
store.state.count // 类型为 number
}
}
4 对前序业务进行简化处理。
4.1 定义
// store.ts
import { InjectionKey } from 'vue'
import { createStore, useStore as baseUseStore, Store } from 'vuex'
export interface State {
count: number
}
export const key: InjectionKey<Store<State>> = Symbol()
export const store = createStore<State>({
state: {
count: 0
}
})
// 定义自己的 `useStore` 组合式函数
export function useStore () {
return baseUseStore(key)
}
4.2 使用
// vue 组件
import { useStore } from './store'
const store = useStore()
console.log(store.state.count) // 类型为 number
5 支持module
5.1 模块代码 ,export 时,store + 接口(数据规范)
export interface iDemo {
count:number,
name:string,
}
export const demoStore = {
namespaced: true,
state:{
count:1,
name:'hello'
},
mutations:{
incr(state:iDemo) {
state.count ++;
}
},
getters:{
countDouble: (state:iDemo) => {
return state.count * 2;
},
},
}
5.2 store 入口文件 ,使用demo
import { stat } from 'fs'
import { InjectionKey } from 'vue'
import { createStore, useStore as baseUseStore, Store } from 'vuex'
import {demoStore, IDemo} from '@/store/modules/demo'
// 为 store state 声明类型
export interface RootState {
count: number,
demoStore:IDemo
}
// 定义 injection key
export const key: InjectionKey<Store<RootState>> = Symbol()
export const store = createStore<RootState>({
state: {
count: 0
},
mutations:{
incr(state:RootState) :void{
state.count++;
}
},
modules:{
//引入
demoStore
}
})
export function useStore() {
return baseUseStore(key);
}
5.3 组件使用。
<script setup lang="ts">
import { computed } from 'vue'
import { useStore } from '@/store/store'
const store = useStore();
console.log("@@@",store)
</script>
<template>
{{store.state.count}}
{{store.state.demoStore.name}}
{{store.getters['demoStore/countDouble']}}
<button @click="store.commit('incr')"> + 1 处理</button>
</template>
<style scoped>
</style>