You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:42:22