Pinia
Pinna 是 Vue 的状态管理库 ,支持跨组件、页面共享状态。同时支持 vue2 和 vue3。
和 vuex 的区别
- 支持组合式 API
- 可搭配 TypeScript 使用,提供可靠的类型推断
- mutation 已被弃用
- actions 中支持同步和异步方法修改 state 状态
- 每一个 store 仓库都是独立的、扁平化的(不再像 vuex 中的 modules 嵌套),store 之间可以相互调用
- 更加轻量,压缩之后体积只有 1kb 左右
选项式 API 的写法
import { defineStore } from 'pinia';
const useCounterStore = defineStore('counter', {
state: () => ({
count: 1
}),
getters: {
doubleCount: state => state.count * 2
},
actions: {
increment() {
this.count++;
}
}
});
export default useCounterStore;
组合式 API 的写法
import { ref, computed } from 'vue';
import { defineStore } from 'pinia';
const useCounterStore = defineStore('counter', () => {
const count = ref(0);
const doubleCount = computed(() => count.value * 2);
function increment() {
count.value++;
}
return { count, doubleCount, increment };
});
export default useCounterStore;
在组件中使用:
import useCounterStore from '@/stores/counter';
const counterStore = useCounterStore();
console.log(counterStore);
console.log(counterStore.count);
counterStore 的打印结果是一个 Proxy 对象,包括 $dispose
、$id
、$onAction
、$patch
、$reset
、$subscribe
、$state
、_hotUpdate
、_isOptionsAPI
等属性和方法,还包括自己在 store 中定义的 count
、increment
。所以在访问变量时不能写成counterStore.state.count
修改数据
修改数据的方式有三种:
- 直接修改 state 的值,如
counter.count++
- 使用
$patch
方法,可以在同一时间更改多个属性 - 调用 actions 中的方法,如
counter.increment()
import useCounterStore from '@/stores/counter';
const counter = useCounterStore();
counter.count++;
counter.$patch({ count: counter.count + 1 });
counter.increment();
数据解构
下面的方式会丢失响应性:
import useCounterStore from '@/stores/counter';
const { count } = useCounterStore();