定義pinia儲存容器 /stores/piniause-demo.js
/**
* 定義並匯出容器
* 引數1:容器ID,必須唯一
* 引數2:配置物件
*/
export const useDemoStore = defineStore('demo', {
//state:類似元件data,用於儲存資料供全域性呼叫
state: () => ({
count: 100,
name: 'Job',
likes: ['a', 'b', 'c'],
}),
//getters:類似元件computed,用於封裝計算屬性,有快取功能
getters: {
// newCount(state) {
// return state.count + 10; //可以使用state(ts裡最好使用state以用於型別推斷)
// },
newCount() {
return this.count + 10; //也可以使用this
},
},
//actions:類似元件methods,用於封裝業務邏輯,修改state裡的資料
actions: {
changeDatas(value1, value2, value3) {
this.count = value1;
this.name = value2;
this.likes.push(value3);
},
},
});
使用pinia儲存資料 /pages/piniause-demo.vue
<template>
<div>{{ demoStore.count }}</div>
</template>
<script setup>
import { useDemoStore } from '~/stores/piniause-demo.js' //引入例項
import { storeToRefs } from 'pinia' //引入API
/* -----初始化例項----- */
const demoStore = useDemoStore()
/* -----獲取資料----- */
console.log(demoStore.count) //直接獲取
const { count, name } = storeToRefs(demoStore) //解構獲取(響應式),注:直接const {count,name} = demoStore會丟失響應
console.log(count, name)
/* -----修改資料----- */
//方式1:單個直接修改(不推薦)
demoStore.count = 200
//方式2:簡單的:$patch方法-直接批次修改(注:此方式經測試,賦空值時不生效,建議用方式3)
demoStore.$patch({
count: 200,
name: 'Jack',
likes: [...demoStore.likes, 'd'],
})
//方式3:複雜一點的:$patch方法-函式批次修改
demoStore.$patch((state) => {
state.count = 200
state.name = 'Jack'
state.likes.push('d')
})
//方式4:再複雜一點的:封裝到actions裡做處理
demoStore.changeDatas(200, 'Jack', 'd') //可以定義動態引數
/* -----getters計算屬性----- */
console.log(demoStore.newCount)
</script>
<style lang="less" scoped></style>