vue3如何用pinia替代vuex
pinia是vue團(tuán)隊(duì)推薦代替vuex的一款輕量級(jí)狀態(tài)管理庫(kù)。
1. 安裝
npm i pinia --save
2. pinia特點(diǎn)
- 完整的typescript支持
- 足夠輕量,壓縮后的體積只有1.6kb
- 去除mutations,只保留state,getters,actions
- actions同時(shí)支持同步和異步
- 沒(méi)有modules模塊的概念,只有store,store之間可以互相引用,更好的代碼分割
3. 使用
1.初始化store
創(chuàng)建目錄store/index.ts
import { createPinia } from 'pinia'
const store = createPinia()
export default store
2.在main.ts引用store
import { createApp } from 'vue'
import App from './App.vue'
import store from './store'
const app = createApp(App)
app.use(store)
app.mount('#app')
3.創(chuàng)建store
根據(jù)功能模塊在store下創(chuàng)建ts文件,維護(hù)各個(gè)功能的數(shù)據(jù),如用戶模塊user.ts,維護(hù)兩個(gè)字段:userInfo和token,通過(guò)actions里面的方法修改userInfo和token的內(nèi)容
import { defineStore } from 'pinia'
interface UserInfo {
name?: string
age?: number
}
// 第一個(gè)參數(shù)是id,id必填,且需要保證值唯一
export const useUserStore = defineStore('user', {
state: (): {
userInfo: UserInfo
token: string
} => {
return {
userInfo: {},
token: ''
}
},
getters: {
newName: state => state.userInfo.name + '牛'
},
actions: {
updateUserInfo(userInfo: UserInfo) {
this.userInfo = userInfo
},
updateToken(token: string) {
this.token = token
}
}
})
4.讀取數(shù)據(jù)
引入要讀取的store
<script setup lang="ts">
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
// 讀取state中的數(shù)據(jù)
const userInfo: ComputedRef<{
name?: string
age?: number
}> = computed(() => userStore.userInfo)
// 讀取getter中的數(shù)據(jù)
const newName = userStore.newName
</script>
5.修改數(shù)據(jù)
<script lang="ts" setup>
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
function handleLogin() {
userStore.updateUserInfo({ name: '李二' })
}
</script>
6.store的相互引用
不同store之間引用,舉個(gè)??:創(chuàng)建user2.ts,引用user.ts的數(shù)據(jù)
import { defineStore } from 'pinia'
import { useUserStore } from './user'
export const useUser2Store = defineStore('user2', {
state: (): {
sex: string
} => {
return {
sex: '0'
}
},
actions: {
sayInfo(sex: string) {
this.sex = sex
// 引用其他store
const userStore = useUserStore()
console.log(
`我叫${userStore.newName}, 我是個(gè)小${
this.sex === '0' ? '姑娘' : '伙子'
}`
)
}
}
})
在組件中使用user2模塊
<script lang="ts" setup>
import { useUser2Store } from '../../store/user2'
const user2Store = useUser2Store()
setTimeout(() => {
user2Store.sayInfo('1')
}, 3000) // 3s后輸出----》 我叫李二牛, 我是個(gè)小伙子
</script>
7.devtools
在devtools中可以看到,pinia會(huì)自動(dòng)根據(jù)文件區(qū)分模塊!

4.數(shù)據(jù)持久化
開啟持久化可以在頁(yè)面刷新的時(shí)候,幫我們把數(shù)據(jù)緩存下來(lái),不被清空。
1.安裝插件
npm i pinia-plugin-persist --save
2.引用插件
在store/index.ts引入插件,并且use
import { createPinia } from 'pinia'
import piniaPluginpersist from 'pinia-plugin-persist'
const store = createPinia()
// 使用持久化插件
store.use(piniaPluginpersist)
export default store
3.在store模塊中啟用持久化
(1) 啟用
在user.ts中啟用:添加persist配置項(xiàng)
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: (): {
userInfo: UserInfo
token: string
} => ({
userInfo: {},
token: ''
}),
getters: { ... },
actions: { ... },
// 開始數(shù)據(jù)持久化
persist: {
enabled: true
}
})
數(shù)據(jù)會(huì)默認(rèn)存儲(chǔ)到sessionStorage,可以在控制臺(tái)看到。

(2) 修改key & 存儲(chǔ)位置
默認(rèn)存儲(chǔ)到sessionStorage的key值就是store模塊id值??梢酝ㄟ^(guò)strategies修改key值和存儲(chǔ)位置,如:
將key值改為_user,存儲(chǔ)位置改為localStorage(注意之前緩存在sessionStorage中的數(shù)據(jù)還在,可以手動(dòng)清除一下sessionStorage.clear())
persist: {
enabled: true,
strategies: [{
key: '_user',
storage: localStorage
}]
}
在控制臺(tái)打印localStorage

(3) 自定義要持久化的字段
默認(rèn)會(huì)將store中的所有字段都緩存,可以通過(guò)paths指定要緩存的字段。
如:我只要緩存userInfo
persist: {
enabled: true,
strategies: [{
key: '_user',
storage: localStorage,
paths: ['userInfo']
}]
}
控制臺(tái)打印,可以看到token字段沒(méi)有了!

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談使用mpvue開發(fā)小程序需要注意和了解的知識(shí)點(diǎn)
這篇文章主要介紹了淺談使用mpvue開發(fā)小程序需要注意和了解的知識(shí)點(diǎn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
vue如何通過(guò)image-conversion實(shí)現(xiàn)圖片壓縮詳解
在Vue項(xiàng)目中上傳大圖片時(shí),可以通過(guò)image-conversion庫(kù)壓縮至指定大小,這篇文章主要介紹了vue如何通過(guò)image-conversion實(shí)現(xiàn)圖片壓縮的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
Vue微信項(xiàng)目按需授權(quán)登錄策略實(shí)踐思路詳解
這篇文章主要介紹了Vue微信項(xiàng)目按需授權(quán)登錄策略實(shí)踐思路詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05
vue.js添加一些觸摸事件以及安裝fastclick的實(shí)例
今天小編就為大家分享一篇vue.js添加一些觸摸事件以及安裝fastclick的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
vue中el-table前端如何導(dǎo)出excel數(shù)據(jù)表格
這篇文章主要介紹了vue中el-table前端如何導(dǎo)出excel數(shù)據(jù)表格,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題
這篇文章主要介紹了解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題,初步判斷可能是因?yàn)橄路綉医觱ue-seamless-scroll是靜態(tài)的,沒(méi)同步DOM,本文給大家分享解決方法,感興趣的朋友一起看看吧2021-11-11

