Skip to content

状态管理

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

模板预设了 Piniapinia-plugin-persist-uni

  • Pinia - 直接的, 类型安全的, 使用 Composition API 的轻便灵活的 Vue 状态管理
  • pinia-plugin-persist-uni - pinia 在 uniapp 中数据持久化插件
ts
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useCountStore = defineStore('count', () => {
  const count = ref(0)

  function inc() {
    count.value += 1
  }
  function dec() {
    count.value -= 1
  }

  return {
    count,
    inc,
    dec,
  }
}, {
  persist: {
    enabled: true,
    detached: true, // 设置订阅与组件分离
  },
})
vue
<script setup lang="ts">
  const { inc, dec } = useCountStore()
  const { count } = storeToRefs(useCountStore())
</script>

<template>
  <div my-4>
    <div mb1 text-gray:80>
      下面数据已通过 pinia 存储并持久化,不信请刷新
    </div>
    <div flex="~ items-center">
      <u-button h="!6" w="!12" type="success" text="-" @click="dec" />
      {{ count }}
      <u-button h="!6" w="!12" type="success" text="+" @click="inc" />
    </div>
  </div>
</template>

WARNING

报错:Uncaught SyntaxError: The requested module '/node_modules/vue-demi/lib/index.mjs?v=701bef9f' does not provide an export named 'hasInjectionContext'

pinia v2.1.X 版本要求 vue 3.3 或者 vue-demi latest ,如果 uniapp 的 vue 版本是 ^3.2.45,通过 pinia 降级到 2.0.X 可以运行和使用。