Pinia状态管理

Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。

相比 Vuex 来讲,Pinia 简便了很多,使用起来非常方便,也可以算是下一代的 Store

存放目录及内置Store

存放Store的目录在 src/store/modules, 目前系统有以下几处使用了 Pinia:

  • app.js 保存整个系统的设置信息,包括个人的个性化设置
  • config.js 保存系统设置里的站点配置信息
  • doc.js 保存访问API文档的身份信息
  • iframe.js 保存iFrame类型菜单的keepalive信息
  • keepAlive.js 保存路由的keepalive信息
  • message.js 保存消息通知的数据
  • tag.js 保存后台系统多标签的数据
  • user.js 保存当前登录用户的信息数据

定义一个Store

src/store/modules/foo.js

import { defineStore } from 'pinia'

const useFooStore = defineStore('foo', {
  state: () => {
    name: '',
  },

  getters: {
    getFoo(state) {
      return { ...state }
    },
  },

  actions: {
    setFooName (name) {
        this.name = name
    }
  }

提示

src/store/index.js 需要增加引入,才能让自己新增的 Store 生效

import { createPinia } from 'pinia'
import useUserStore from './modules/user'
import useAppStore from './modules/app'
import useTagStore from './modules/tag'
import useKeepAliveStore from './modules/keepAlive'
import useIframeStore from './modules/iframe'
import useConfigStore from './modules/config'
import useMessageStore from './modules/message'
import useDocStore from './modules/doc'
// 下面引入新增的foo
import useFooStore from './modules/foo'

const pinia = createPinia()

export {
  useUserStore,
  useAppStore,
  useTagStore,
  useKeepAliveStore,
  useIframeStore,
  useConfigStore,
  useMessageStore,
  useDocStore,
  // 下面也导出新增的
  useFooStore
}
export default pinia

使用Store

src/store/modules/foo.js

import { useFooStore } from '@/store'

const fooStore = useFooStore()

// 设置
fooStore.setFooName('法外狂徒-张三')

// 输出到控制台
console.log(fooStore.name)