具有组合式api的状态管理库,类似vuex的状态管理工具
1、没有mutations,只有state、getters、actions 2、分模块不需要modules 3、体积小
jspnpm i pinia
main.ts
中注册
tsimport { createPinia } from 'pinia';
createApp(App).use(createPinia()).use(router).mount('#app');
通过defineStore
创建, id
具有全局唯一性
tsimport { defineStore } from 'pinia';
export const useStore = defineStore('id', {
});
和vuex中的state一样都是用于存放数据状态,不同在于pinia
中state的属性值为一个函数,且返回需要管理的状态
第二个参数直接为对象
tsimport { defineStore } from 'pinia';
export const userInfoStroe = defineStore('userinfo', {
state: () => {
return {
name: '',
token: '',
};
},
});
类比vuex中的getters,同样会根据其依赖的状态缓存
ts
import { defineStore } from 'pinia';
export const userInfoStroe = defineStore('userinfo', {
state: () => {
return {
name: '',
token: '',
};
},
getters: {
deluserinfo: (state) => {
state.name='';
state.token='';
}
},
});
通过使其返回值为一个函数实现传参
tsgetters: {
getUserById: (state) => {
return (userId) => state.users.find((user) => user.id === userId)
},
},
注意点: 此方式会使得其不再根据依赖的状态缓存结果,只是相当于调用函数
第二个参数为函数,函数内部定义了一些响应式属性和方法,然后将其暴露出去
ref()
就是state
属性
computed()
就是 getters
function()
就是 actions
tsimport { defineStore } from 'pinia';
export const userInfoStroe = defineStore('userinfo', {
let userinfo = reactive({
name: '',
token: '',
});
const deluserinfo = function(){
userinfo.name='';
userinfo.token='';
}
return { userinfo, deluserinfo }
});
vue... <script lang="ts" setup> import { userInfoStroe } from '../../pinia/LoginAndRegister'; const userStroe = userInfoStroe(); console.log(11, userStroe.username, userStroe.token); </script>
直接书写多个store文件,然后页面引入调用即可
在.vue
组件种在使用userinfoStore()
获取Store的state时,如果采用解构,则需要调用storeToRefs()
将其包裹避免丢失响应式
ref
action
或非响应式 (不是 ref
或 reactive
) 的属性vue<template> <div> <p>{{name}}</p> <butten @click="deluserinfo">清除</butten> </div> </template> <script lang="ts" setup> import { storeToRefs } from 'pinia'; import userinfoStore from '@store/userinfo/userinfo'; const store = userinfoStore(); let { name, token } = storeToRefs(store); // 对于`action`可以直接解构 let { deluserinfo } = store;
本文作者:RKLS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!