关于响应模式的一些小疑惑
发布于 3 年前 作者 huaer 1250 次浏览 来自 问答
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

我们的app使用lazyload模式,在ui获取数据的时候才进行加载,这样对应的方法将会返回promise,而且可能会使用dispatch/commit从其他模块获取数据,所以getter似乎满足不了我们的需求。
所以我们又封装了一proxy来完成这个需求,代码像下面这样:

JS代码

/**
   * @description 获取好友id列表
   * @param {boolean} refresh [optional default: false] 是否刷新数据
   * @param {boolean} async [optional default: false] 是否需要异步回调
   * @return {Promise<number[]> | number[]}
   */
  getFriendIds({
    refresh,
    async,
  }) {
    const { getters, dispatch } = store;
    const ret = getters['contacts/getFriendIds'];
    let request = refresh;
    if (!request && !ret) {
      request = true;
    }
    if (async) {
      if (request) {
        return dispatch('contacts/fetchMyFriendList')
          .then(() => getters['contacts/getFriendIds']);
      }
      return Promise.resolve(ret);
    }
    if (request) {
      dispatch('contacts/fetchMyFriendList').catch(() => null);
    }
    return ret;
  },

但是这样我们产生了一些疑问:
1.getter只暴露了state、getter,但是proxy使用了action、mutation,因此我们在初始化代理时直接绑定了store实例,这样符合vue的设计吗?
2.getter是可以基于它们的响应式依赖进行缓存的,但是proxy应该是没有缓存的,是不是每一帧渲染都会调用proxy封装的方法?如何使proxy也进行缓存?

回到顶部