跳至主要内容

[Pinia] 搭配Composition API

TL;DR

Pinia搭配Composition API使用。

參考資料

相關連結


範例

我們複製一份 前一篇PiniaPractice.vue的程式碼

並且重新命名為PiniaPracticeComposition.vue,將newPage下的路由等等設定好:

./src/views/PiniaPracticeComposition.vue
<template>
{{ user.name }} / {{ user.getUserName }} / {{ user.wallet }}
<br>
<button type="button" class="btn btn-primary" @click="user.updateName">user.updateName按鈕</button>
<hr>
<h2>解構並透過storeToRefs雙向綁定</h2>
{{ name }} / {{ getUserName }} / {{ wallet }}
<button type="button" class="btn btn-primary" @click="updateName">解構updateName按鈕</button>
<hr>
<button type="button" class="btn btn-primary me-2" @click="updateByPatch">透過patch修改</button>
<button type="button" class="btn btn-primary" @click="reset">Reset</button>
</template>

<script>
import userStore from '@/stores/user.js'
import { storeToRefs } from 'pinia';
export default {
setup() {
// Composition
const user = userStore();
// 因為需要雙向綁定,所以才需要使用storeToRefs
const {name,getUserName,wallet} = storeToRefs(user)
// 因為方法不需要雙向綁定,所以直接解構賦值即可
const {updateName} = user;


// 修改狀態方法
// 方法一:直接操作狀態
user.name='漂亮阿姨'
// 方法二:解構取出狀態下
name.value='杰倫'

// 方法三:$patch
function updateByPatch(){
user.$patch({
// 可以指定要修改的項目有哪些,如果只有name就只會修改name
name:'透過patch更新的Name',
// 如果有name也有wallet則兩個都會修改
// wallet: '1000'
})
}
function reset(){
// 恢復到Store初始狀態
user.$reset();
}

return {
user,
name,
getUserName,
wallet,
updateName,
updateByPatch,
reset
}
},
}
storeToRefs

storeToRefs可以產生雙向綁定,因為方法不需要雙向綁定所以不用使用storeToRefs

透過storeToRefs的資料會是物件形式,如果需要修改內容則需要透過 .value才可以將內容取出或修改。

解構狀態下為物件形式

console.log(name)