状态管理

得益于组合式方法(Composition API),管理状态非常简单。

Pinia

PiniaVue 官方最新推荐的状态管理库。

ter
pnpm install pinia@2.0.36

安装依赖后,需要做基本设置。

src/main.ts
src/stores/counter.ts
src/pages/index/index.vue
import { createPinia } from 'pinia'
import { createSSRApp } from 'vue'
import App from './App.vue'

const pinia = createPinia()

export function createApp() {
  const app = createSSRApp(App).use(pinia)
  return {
    app,
  }
}

你可以在 dcloudio/uni-app#4350 了解为什么要固定 pinia 版本号。

简单状态管理

你可以直接使用 Vue 提供的 refreactive 方法来做简单状态管理。

ref

src/composables/useCount.ts
src/pages/index.vue
// 全局状态
const globalCount = ref(1)
export function useCount() {
  // 本地状态
  const localCount = ref(1)
  function increment() {
    globalCount.value++
    localCount.value++
  }
  return {
    globalCount,
    localCount,
    increment
  }
}

reactive

src/stores/count.ts
src/pages/index.vue
export const countStore = reactive({
  count: 0,
  increment() {
    this.count++
  }
})

以上例子修改自 Vue 文档的 用响应式 API 做简单状态管理

VueUse

你也可以使用 VueUse 提供的 createGlobalState 进行状态管理,你还可以配合 useStorage 做数据持久。

src/composables/useAuth.ts
src/utils/uniStorage.ts
export const useAuth = createGlobalState(() => {
  const token = useStorage('token', '', uniStorage)
  const isLogin = computed(() => !!token.value)
  const login = (_token: string) => {
    token.value = _token
  }
  const logout = () => {
    token.value = ''
  }
  return {
    token,
    isLogin,
    login,
    logout,
  }
})

如果你正在使用 VueUse v10 并遇到了问题,请查看 dcloudio/uni-app#4604 获取解决方案。