仅用于记录Pinia与Vuex在用法上的区别。
在关键属性上,pinia比vuex省去了不少内容。以下:
| 状态管理器 | 关键属性 |
|---|---|
| Vuex | Store、State、Getter、Mutation、Action、Module |
| Pinia | Store、State、Getter、Action |
当然,他们的实例都叫Store(包含整个应用中访问的数据)。但相比于Vuex全局维护一个Store实例,Pinia以应用模块(即vuex的module)为单位通过defineStore来单独创建store实例。
目录上的小小差异:
# Vuex 示例(假设是命名模块)。
src
└── store
├── index.js # 初始化 Vuex,导入模块
└── modules
├── module1.js # 命名模块 'module1'
└── nested
├── index.js # 命名模块 'nested',导入 module2 与 module3
├── module2.js # 命名模块 'nested/module2'
└── module3.js # 命名模块 'nested/module3'
# Pinia 示例,注意 ID 与之前的命名模块相匹配
src
└── stores
├── index.js # (可选) 初始化 Pinia,不必导入 store
├── module1.js # 'module1' id
├── nested-module2.js # 'nested/module2' id
├── nested-module3.js # 'nested/module3' id
└── nested.js # 'nested' id
Vuex
import { createApp } from 'vue'
import { createStore } from 'vuex'
const store = createStore({
state(){
return { count: 0}
},
mutations: {},
getters:{},
actions:{}
})
const app = createApp({/* 根组件 */})
app.use(store)
// 随后通过引入的store实例或全局挂载到vue属性中,通过store.state.xxx调用状态值
Pinia
// 1、在vue中注入。 main.js
import {createApp} from 'vue'
import {createPinia} from 'pinia'
import App from './App.vue'
const pinia = createPinia()
const app = createApp(App)
app.use(pinia)
app.mount('#app')
// 2、useStore.js 定义一个pinia的store
import {defineStore} from 'pinia'
export const useStore = defineStore('main', {
state: ()=>{},
getters:{},
actions:{}
})
// 3、最后在各组件中
import {useStore }from '@/store/useStore'
const store = useStore()
store.username // 对应state中username
Vuex 使用单一状态树(用一个对象包含了全部的应用层级 状态),因此它便作为一个“唯一数据源(SSOT)”而存在。而通过模块化modules来细化到每个小应该模块的状态管理。
vuex-persistedstate, vuex-persistedstate文档1、安装
npm install --save vuex-persistedstate
2、使用
import { createStore } from "vuex";
import createPersistedState from "vuex-persistedstate";
const store = createStore({
// ...
plugins: [createPersistedState()],
});
pinia-plugin-persist, 官方文档1、安装
# npm安装
npm install pinia-plugin-persist -D
# 或者yarn
yarn add pinia-plugin-persist
2、注入
import {createApp} from 'vue'
import {createPinia} from 'pinia'
import piniaPersist from 'pinia-plugin-persist'
import App from './App.vue'
const pinia = createPinia()
pinia.use(piniaPersist)
const app = createApp(App)
app.use(pinia).mount('#app')
3、添加types说明
{
"compilerOptions": {
"types": [
"pinia-plugin-persist"
]
},
}