如何让Recoil的atom/atomFamily执行深度比较而非默认浅比较?
如何让Recoil的Atom/AtomFamily执行深度比较而非默认浅比较?
Recoil 默认在设置 atom 状态时,只会通过浅比较来判断是否触发状态更新。如果需要让 atom 或 atomFamily 基于深度比较来决定是否更新状态,该怎么做?
可行方案:基于Atom+Selector的工厂函数
可以通过封装一个工厂函数,用内部 atom 存储状态,再用 selector 包裹并在其 set 方法中加入深度比较逻辑,具体代码如下:
export const createAtomWithDeepEqualityCheck = <T>(options: AtomOptions<T>) => { const _atom = atom(options); const wrappedAtom = selector<T>({ key: `selector-${options.key}`, cachePolicy_UNSTABLE: { eviction: 'most-recent' }, get: ({ get }) => get(_atom), set: ({ get, set }, newValue) => { const currValue = get(_atom); if (_isEqual(currValue, newValue)) { return; } set(_atom, newValue); }, }); return wrappedAtom; };
方案说明与局限性
这个方案能有效实现深度比较触发更新的需求,但存在一个关键局限性:无法在 Recoil 原子事务(Transactions)中使用,因为事务场景下对 selector 的 set 操作存在限制,会导致该逻辑无法正常工作。
内容的提问来源于stack exchange,提问作者Taylor Johnson
相关产品推荐
相关产品推荐

