本文最后更新于:2024年4月25日 上午
pinia
比vuex
有更好的类型提示,即使不使用TS
也能够实现属性,方法的自动补全
pinia
同时支持Vue2
与Vue3
引入Pinia
🍍安装
🍍导入
main.js
1 2 3 4 5 6 7 8 9
| import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue'
const pinia = createPinia()
const app = createApp(App) app.use(pinia) .mount('#app')
|
创建store
🌿申明store
src /stores /userStore.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { defineStore } from 'pinia'
export const useUserStore = defineStore({ id = 'user', state: () => {}; getters: {}; actions: {}; })
export const useStore = defineStore('user', { state: () => {}; getters: {}; actions: {}; })
|
🌿setup式
- 使用
ref()
,reactive()
定义state
属性
- 使用
computed()
定义getters
- 在
defineStore
内使用自身的computed, ref
属性均要加.value
- 外部使用无需
.value
(整个store会包一层reactive
)
- 使用
function()
定义actions
- 同
setup
需要将使用所需的方法,属性return
1 2 3 4 5 6 7 8
| import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', () => { const name = ref('Jonathan') const age = ref(20) })
|
State
🥬定义state
state
是一个返回一个存有全局状态变量的对象的函数
1 2 3 4 5 6 7 8
| export const useStore = defineStore('main', { state: () => { return { title: 'Pinia🍍', date: '2022/1/23 下午1:35:22' } } });
|
🥬获取state
📌获取整个store
对象
1 2 3 4 5 6 7 8 9 10 11
| <script setup> import { useStore } from 'xxx/index.js' const store = useStore() console.log(store.title) </script>
<template> <h1> {{ store.title }} </h1> </template>
|
📌获取静态属性
请注意,store
是一个用 reactive
包装的对象,这意味着不需要在 getters 后面写 .value
,就像 setup
中的 props
一样,如果你写了,我们也不能解构它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <script setup> import { useStore } from 'xxx/index.js' const { title } = useStore()
</script>
<template> <h1> {{ title }} </h1> </template>
|
📌获取动态属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <script setup> import { useStore } from 'xxx/index.js' import { storeToRefs } from 'pinia' const { title } = storeToRefs(useStore())
</script>
<template> <h1> {{ title }} </h1> </template>
|
🥬更新state
状态
📌直接修改
1 2 3 4 5 6
| <script setup> import { useStore } from 'xxx/index.js' const store = useStore() store.title = 'Hello Pinia!' </script>
|
📌使用$patch
1 2 3 4 5 6 7 8 9 10 11 12 13
| <script setup> import { useStore } from 'xxx/index.js' const store = useStore() store.$patch({ title: 'Hello Pinia!', nums: [0, 1, 2, 3] }) store.$patch((state) => { state.nums[0]++ }) </script>
|
📌调用Action
推荐使用actions
的方法来更改状态值
🥬重置state
组件内调用$reset()
方法可使状态回归至初态
1 2 3 4 5 6
| <script setup> import { useStore } from 'xxx/index.js' const store = useStore() store.title = '?>-=+.@1#' store.$reset() </script>
|
Getter
getter
类似计算属性,用于返回一些计算后取得的值,有缓存功能
🍉调用自身store
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import { defineStore } from 'pinia'
export const useStore = defineStore('foo', { state: () => ({ value: 3 }), getters: { doubleValue: (state) => 2 * state.value, trebleValue() { return 3 * this.value }, fivefoldValue: { return doubleValue(state) + trebleValue(state) } } })
|
🍉调用其他store
1 2 3 4 5 6 7 8 9 10 11 12
| import { defineStore } from 'pinia' import { useStore2 } from 'url'
export const useStore = defineStore('bar', { state: () => ({ value: 1 }), getters: { add() { const state2 = store2() return this.value + state2.value } } })
|
action
与Getter
相似
🥒调用自身store
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import { defineStore } from 'pinia'
export const useStore = defineStore('foo', () => { state: () => ({ value: 3 }), actions: { doubleValue: (state) => 2 * state.value, trebleValue() { return 3 * this.value }, fivefoldValue: { return doubleValue(state) + trebleValue(state) } } })
|
🥒调用其他store
1 2 3 4 5 6 7 8 9 10 11 12
| import { defineStore } from 'pinia' import { store2 } from 'url'
export const useStore = defineStore('bar', () => { state: () => ({ value: 1 }), actions: { add() { const state2 = store2() return this.value + state2.value } } })
|
工程化
数据持久化
🍐安装插件
1
| pnpm i pinia-plugin-persist
|
🍐挂载插件
main.ts
1 2 3 4 5 6 7 8 9
| import { createApp } from 'vue' import { createPinia } from 'pinia' import piniaPluginPersist from 'pinia-plugin-persist' import App from './App.vue'
const app = createApp(App)
app.use(createPinia().use(piniaPluginPersist)) .mount('#app')
|
🍐开启缓存
1 2 3 4 5 6 7
| export const useStore = defineStore('main', { persist: { enable: true, } })
|