JiatLn/JiatLn.me

Pinia文档、源码试读 —— Getters 属性的一些思考

Opened this issue · 0 comments

Getters 属性

参考官方文档:https://pinia.vuejs.org/core-concepts/getters.html

getters 属性的用法有两种,分别是带参数和不带参数的方式。

不带参数

const useStore = defineStore({
  id: 'user',
  state: () => {
    return {
      count: 1,
    };
  },
  getters: {
  	dbCount: (state) => state.count * 2,
  	// 或者以下两种方式
  	dbCount(state) { return state.count * 2 }
  	dbCount(): number { return this.count * 2 }
  },
});

在第三种用法中,不用写 state 参数,在方法里面直接使用 this 也是指向当前 storestate
(这里我个人推荐第三种写法,能少写参数就少写点)

Note:这里是需要结合 typescript,标注返回的参数的类型(必填 )。

不带参数的 getters 调用方法和正常的 state 一样:

const store = useStore();
store.count; // 1
store.dbCount; // 2
store.count++;
store.dbCount; // 4

有点类似于Vue中的计算属性,依赖的状态改变时,相应的 getters 也会变化。

带参数的用法

有时,我们需要使用到参数的用法,比如根据 ulid 获取相应的数据。

 getters: {
   getUserByUlid() {
     // do somethings...
     // console.log('xxxxx'); // 只会执行一次.
     return (ulid: string): IUserInfo | undefined => this.userList.find((item) => item.ulid === ulid);
   },
 }

可以看到,在 getYuhunByUlid 中,是通过返回一个函数的方式实现带参数的 getters
这种返回函数的函数就是传说中的 高阶函数
调用方式如下:

const store = useStore();
let user = store.getUserByUlid('fooxxxbarxxxbaz'); // 返回类型 IUserInfo 或 undefined

Thinking:带参数的 getters 为什么要通过高阶函数的方式来实现?

为什么要使用高阶函数(函数返回一个函数)来使用,而不是像这样:

 getters: {
   getUserByUlid(state, ulid) {
     return state.userList.find((item) => item.ulid === ulid);
   },
 }

虽然没有标注变量类型,但还是明显比使用高阶函数简洁了许多,直接这样写不就好了吗?

带着这个疑问,这就需要我们开康康源码了orz

未完待续。。。