1. pinia和vuex的區別
- pinia沒有mutations,只有:state、 getters、 actions
- pinia分模組不需要modules(之前vuex分模組需要modules)
- pinia體積更小(效能更好)
- pinia可以直接修改state資料
2.安裝pinia
npm i pinia
根據需要 安裝pinia-plugin-persist外掛,實現持久化儲存
npm i pinia-plugin-persist
3.main.ts中匯入
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia' // 從pinia中匯入createPinia方法
import piniaPersist from 'pinia-plugin-persist' //匯入持久化儲存
const app = createApp(App)
const pinia = createPinia()
pinia.use(piniaPersist) //使用持久化儲存,不需要可不寫
app.use(pinia) // 使用vue例項的use方法,告訴vue我們要使用pinia
app.mount('#app')
4.建立store
新建store資料夾,新建userInfo.ts模組檔案來存放使用者資訊相關的資料,因為pinia中沒有modules區分模組,store下的每個檔案就是一個模組
建立store很簡單,呼叫pinia中的defineStore函式即可,該函式接收兩個引數:
name:一個字串,必傳項,該store的唯一id。
options:一個物件,store的配置項,比如配置store內的資料,修改資料的方法等等。
我們可以定義任意數量的store,因為我們其實一個store就是一個函式,這也是pinia的好處之一,讓我們的程式碼扁平化了,這和Vue3的實現思想是一樣的。
import { defineStore } from 'pinia' //從pinia中匯入,defineStore方法,用於定義一個新的store
// 第一個引數是應用程式中 store 的唯一 id,最好和檔名同意
export const userInfoStore = defineStore('userInfo', { // 使用defineStore方法定義store
state:() => { // state表示這個store裡的狀態,也就是存放資料的地方
return {
userName: 'pinia定義的資料', // 這裡我們定義了一個資料叫userName,用於存放我們的使用者名稱
}
},
getters: {
double: (state) => '姓名:' + state.userName,
},
actions: {
// 修稿state的值
changeStateVal(val: any) {
this.userName = val
}
},
// 持久化儲存配置
persist: {
enabled: true , // pinia-plugin-persist 是否開啟持久化儲存, 預設sessionStorage
strategies: [{
// key: 'userInfo', //儲存的key,預設當前store的key
// paths: ['userName'], //哪個屬性需要持久化儲存,預設全是
storage: localStorage //使用localStorage儲存
}]
}
})
5.使用store
引入使用即可,pinia中有多種方式可以修改state中的資料
<template>
<div>
{{ store.userName }}
<button @click="handleUpdatePinia">修改pinia資料</button>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from "vue";
import { storeToRefs } from "pinia"; //和vue中toRefs的作用一模一樣
import { userInfoStore } from "../store/userInfo"; //直接引入store中定義的 userInfoStore
const store = userInfoStore(); // 然後例項化
const handleUpdatePinia = () => {
// 第一種方式:直接修改
// store.userName = 'dfads' //直接修改pinia的資料
// 第二種方式 透過$patch
// 1.
// store.$patch({
// userName: "被修改的值",
// });
// 2.
// store.$patch((state) => {
// state.userName = "被修改的值";
// });
//第三種方式 透過actions裡的方法修改
store.changeStateVal("被修改的值"); //可以直接給actions裡面的方法傳遞引數
};
</script>