作用
Pinia 是 Vue.js 的轻量级状态管理库,他可以在组件和页面间共享状态。
相关链接
官方网站:https://pinia.vuejs.org/
中文文档: https://pinia.web3doc.top/introduction.html
使用它的原因
创建单个store的步骤
1. 创建store/user.js
2. const userStore = defineStore("storeId",{
state:()=>{return {}},
actions:{},
getters:{}
});
### 配置对象有state,getters, actions
3. 导出userStore
(1)在main.js
import { createPinia } from 'pinia';
import { createApp } from 'vue';
import App from './App.vue'
const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.mount('#app');
(2)store/userStore.js
import { defineStore } from "pinia";
const useUserStore = defineStore('userStore', {
state: ()=> {
return {
userName: 'heihei',
}
},
actions: ()=>{
},
getters: ()=>{
}
})
export default useUserStore;
(3) 在组件中使用
<script setup>
import { useRoute } from 'vue-router';
import useUserStore from '../store/uerStore';
const userStore = useUserStore();
</script>
<template>
Home
</template>
前置条件
在pinia中没有mutations,只有actions,不管是同步还是异步的操作,都可以在actions中定义。
步骤
定义同步方法
定义异步方法:同上
(1)在userSotre的actions中提供方法并且修改数据
import { defineStore } from "pinia";
const useUserStore = defineStore('userStore', {
state: () => {
return {
userName: 'heihei',
age: 18
}
},
actions: {
increment() {
this.age++
},
incrementAsync() {
setTimeout(() => {
this.age++
}, 1000)
}
},
getters: {
}
})
export default useUserStore;
(2)在Home组件中使用
<script setup>
import { useRoute } from 'vue-router';
import useUserStore from '../store/uerStore';
const userStore = useUserStore();
</script>
<template>
Home
{{userStore.age}}
<button @click="userStore.increment">+1</button>
<button @click="userStore.incrementAsync">异步+1</button>
</template>
总结
作用
pinia中的getters和vuex中的基本是一样的,计算state的状态值。
步骤
实例代码
(1)在getters中提供计算属性
import { defineStore } from 'pinia'
// 1. 创建store
// 参数1:store的唯一表示
// 参数2:对象,可以提供state actions getters
const useCounterStore = defineStore('counter', {
state: () => {
return {
count: 0,
}
},
getters: {
double() {
return this.count * 2
},
},
actions: {
increment() {
this.count++
},
incrementAsync() {
setTimeout(() => {
this.count++
}, 1000)
},
},
})
export default useCounterStore
(2)在组件中使用
<h1>根组件---{{ counter.count }}</h1>
<h3>{{ counter.double }}</h3>
总结
前置条件
如果直接从pinia中解构数据,会丢失响应式, 使用storeToRefs可以保证解构出来的数据也是响应式的
import useAccountStore from '../store/account';
import useUserStore from '../store/uerStore';
const userStore = useUserStore();
const { age} = storeToRefs(userStore);
</script>
<template>
Home
<div>{{age}}</div>
{{ userStore.age }} ---{{ userStore.descAge }}
<button @click="userStore.increment">+1</button>
<button @click="userStore.incrementAsync">-1</button>
</template>
总结
使用storeToRefs可以保证解构出来的数据也是响应式的
步骤
实例代码
useAccountSore
import { defineStore } from "pinia";
const useAccountStore = defineStore('account',{
state:()=>{
return{
accountNumber: '123456',
money: 1000000
}
},
actions:{
addMoney(){
this.money+=100;
}
}
})
export default useAccountStore;
useUserStore
import { defineStore } from "pinia";
import useAccountStore from "./account";
const useUserStore = defineStore('userStore', {
state: () => {
return {
userName: 'heihei',
age: 18
}
},
actions: {
increment(){
this.age +=1;
},
incrementAsync(){
setTimeout(()=>{
this.age -= 1
},1000)
},
addMoney(){
const account = useAccountStore();
account.addMoney();
console.log(account.money)
}
},
getters: {
descAge(){
return this.age - 10;
}
}
})
export default useUserStore;
总结
导入另一个store,直接用xxxxstore名.的方式操作数据或方法
前置条件
在复杂项目中,不可能把多个模块的数据都定义到一个store中,一般来说会一个模块对应一个store,最后通过一个根store进行整合
步骤
(1)新建store/user.js文件
import { defineStore } from 'pinia'
const useUserStore = defineStore('user', {
state: () => {
return {
name: 'zs',
age: 100,
}
},
})
export default useUserStore
(2)新建store/index.js
import useUserStore from './user'
import useCounterStore from './counter'
// 统一导出useStore方法
export default function useStore() {
return {
user: useUserStore(),
counter: useCounterStore(),
}
}
(3)在组件中使用
<script setup>
import { storeToRefs } from 'pinia'
import useStore from './store'
const { counter } = useStore()
// 使用storeToRefs可以保证解构出来的数据也是响应式的
const { count, double } = storeToRefs(counter)
</script>
Pinia API 与 Vuex ≤4 有很大不同,即