Pinia状态管理
目前Vuex
已经不推荐使用,4.x
是最后一版,已经不会有新版本,Pinia
实际就是Vuex 5
,因此推荐使用Pinia
作为状态管理,其实Pinia
使用比Vuex
要简单。实际已经在生成项目的时候已经是集成了Pinia
。
地址:https://pinia.vuejs.org/zh/introduction.html
Pinia简单对比Vuex
这里简单对比一下Pinia
和Vuex
,实现的功能都一样,就是全局的状态数据共享,Pinia
简化了以前使用Vuex
的一些重复的多余的步骤,简化状态管理
对比项目 | Pinia | Vuex |
---|---|---|
state | state简单数据可以直接修改(也不推荐) | 不推荐直接修改state,需要用mutation或者action修改 |
getters | 支持 | 支持 |
mutations | 废弃 | 支持,更新数据必需 |
actions | 推荐用action修改数据 | 支持,更新数据必需 |
持久化 | pinia-plugin-persistedstate | vuex-persistedstate |
modules模块 | 多store文件,按需import | 支持多模块:Mudule1/gettter1,但是需要拼接名称,较为繁琐 |
devtools | 支持 | 支持 |
安装使用
import { createPinia } from 'pinia'
import App from '@/App.vue'
const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
Pinia基本使用
Pinia
支持选项式API
和组合式API
,因为Vue3
通常都是用组合式API
,因此使用Pinia
的时候也考虑用组合式API
Store定义
组合式API相对简单:
ref()
就是state
属性computed()
就是getters
function()
就是actions
import { ref } from 'vue'
import { defineStore } from 'pinia'
import { GlobalLayoutMode, GlobalLocales } from '@/consts/GlobalConstants'
import { changeMessages } from '@/messages'
export const useGlobalConfigStore = defineStore('globalConfig', () => {
const currentLocale = ref(GlobalLocales.CN)
const layoutMode = ref(GlobalLayoutMode.LEFT)
return {
currentLocale,
layoutMode,
changeLocale (locale) {
if (Object.values(GlobalLocales).includes(locale)) {
currentLocale.value = locale
} else {
throw new Error(`Locale ${locale} is not supported.`)
}
changeMessages(locale)
},
changeLayout (layout) {
if (Object.values(GlobalLayoutMode).includes(layout)) {
layoutMode.value = layout
} else {
throw new Error(`Layout ${layout} is not supported.`)
}
}
}
})
Store使用
在Vue
组件中使用比较简单,直接import
并结构出store
的定义方法,然后就可以直接使用里面的state
和action
方法
<script setup>
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
import { $changeLocale, elementLocale, $i18nBundle } from '@/messages'
const globalConfigStore = useGlobalConfigStore()
$changeLocale(globalConfigStore.currentLocale)
</script>
<template>
<el-config-provider :locale="elementLocale.localeData">
<router-view />
</el-config-provider>
</template>
<style scoped>
</style>
集成持久化
通常情况下我们还会把一些状态存储到localStorage
,不然刷新页面或者再次进入页面就会丢失状态,比如主题样式,语言、登录信息等
安装插件:npm i pinia-plugin-persistedstate
// 注册插件
import { createPinia } from 'pinia'
import App from '@/App.vue'
import piniaPluginPersistedState from 'pinia-plugin-persistedstate'
const app = createApp(App)
const pinia = createPinia()
pinia.use(piniaPluginPersistedState)
app.use(pinia)
然后在定义store的时候加上:
{
persist: true
}
最终开源地址: