Appearance
pinia 入门
详细文档请访问 pinia
安装
使用 npm
shell
npm i pinia
使用 yarn
shell
yarn add pinia
使用 pnpm
shell
pnpm i pinia
在 vue 中使用
ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
const app = createApp()
const pinia = createPinia()
app.use(pinia)
app.mount('#app')
定义一个 Store
导出的 store 函数名一般使用 use 开头
ts
import { defineStore } from 'pinia'
// 第一个参数在全局store中的唯一id
export const useUserStore = defineStore('user', {})
在页面中使用 store
vue
<script lang="ts" setup>
import { useUserStore } from '@/store/model/userStore'
const userStore = useUserStore()
// 可以使用userStore.xx来访问store中的内容
</script>
or
vue
<script lang="ts" setup>
import { storeToRefs } from 'pinia'
import { useUserStore } from '@/store/model/userStore'
const userStore = useUserStore()
const { userInfo } = storeToRefs(userStore)
</script>
State
ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => {
return {
userInfo: null,
}
},
})
在页面中访问 state
可以直接写入/读取状态
js
import { useUserStore } from '@/store/model/userStore'
const userStore = useUserStore()
userStore.userInfo = { name: 'wxw', age: 23 }
console.log(userStore.userInfo)
重置状态
js
import { useUserStore } from '@/store/model/userStore'
const userStore = useUserStore()
userStore.$reset()
Getters
可以等同于 vue 中的计算属性
ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => {
return {
userInfo: null,
}
},
getters: {
getUserInfo() {
return this.userInfo
},
},
})
在页面中使用 getter
getter 是属性,访问时不需要使用函数的方式来访问
vue
<script lang="ts" setup>
import { useUserStore } from '@/store/model/userStore'
const userStore = useUserStore()
setTimeout(() => {
userStore.userInfo = { name: 'wxw', age: 23 }
}, 3000)
</script>
<template>
<div>{{ userStore.getUserInfo }}</div>
</template>
Actions
相当于组件的方法(vue2 中的 methods)
ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => {
return {
userInfo: null,
}
},
getters: {
getUserInfo() {
return this.userInfo
},
},
actions: {
setUserInfo(userInfo) {
this.userInfo = userInfo
},
// 也支持异步方法
async setAdmin(userInfo) {
try {
const { code, data, message } = await setUserApi(userInfo)
}
catch (error) {
throw error
}
},
},
})
在组件中使用
vue
<script lang="ts" setup>
import { useUserStore } from '@/store/model/userStore'
const userStore = useUserStore()
function setUser() {
userStore.setUserInfo({ name: 'wxw', age: 23 })
}
</script>
<template>
<button @click="setUser">
设置用户信息
</button>
<div>{{ userStore.getUserInfo }}</div>
</template>
Plugins
INFO
todo plugins 部分的演示