关于响应模式的一些小疑惑
粉丝福利 : 关注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也进行缓存?