如何在Effector的pending方法中获取effect的参数?
如何在Effector的pending方法中获取effect的参数?
嘿,这个问题我之前也纠结过!Effector的pending事件确实只返回一个布尔值,不会携带调用时的参数,但咱们换个思路就能解决——利用effect的started事件,它可是会把调用时的payload完整传过来的。
下面给你两种实用的实现方式:
方法一:扩展Store状态,结合started/done/fail事件
这种方式最直观,我们给Store增加两个字段:一个标记请求是否处于pending状态,另一个用来存储当前请求的参数。
首先修改Store的初始状态:
const usersStore = createStore({ users: [], isPending: false, currentRequestParams: null // 用来存请求参数 });
然后监听effect的started事件,在这里设置pending状态为true,同时保存传入的参数:
// 当请求开始时,记录参数并标记pending usersStore.on(getUsersEffect.started, (state, payload) => ({ ...state, isPending: true, currentRequestParams: payload // 这里就能拿到{MY_CUSTOM_KEY: 10}啦 }));
最后监听done和fail事件,在请求结束后重置状态:
// 请求结束(成功/失败)后,重置pending和参数 usersStore.on([getUsersEffect.done, getUsersEffect.fail], (state) => ({ ...state, isPending: false, currentRequestParams: null }));
这样你就能在Store的状态里随时拿到当前pending请求的参数了,完全符合你的需求。
方法二:自定义事件传递参数(适合复杂场景)
如果你的业务场景需要更灵活的参数处理,可以自定义一个事件,在调用effect时同时触发这个事件传递参数:
// 自定义一个事件,用来传递请求参数 const userRequestStarted = createEvent(); // 监听这个事件,在Store里保存参数 usersStore.on(userRequestStarted, (state, params) => ({ ...state, currentRequestParams: params })); // 结合pending事件管理状态 usersStore.on(getUsersEffect.pending, (state, isPending) => ({ ...state, isPending })); // 调用effect时,同时触发自定义事件 const fetchUsers = (params) => { userRequestStarted(params); getUsersEffect(params); }; // 调用的时候用这个封装后的方法 fetchUsers({MY_CUSTOM_KEY: 10});
这种方式把参数传递和pending状态管理分开,适合需要对参数做额外处理的场景。
总结一下,核心就是**pending事件本身不携带参数,但started事件会完整传递调用payload**,利用这一点就能轻松实现需求啦!
备注:内容来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

