Recoil Versions Save

Recoil is an experimental state management library for React apps. It provides several capabilities that are difficult to achieve with React alone, while being compatible with the newest features of React.

0.7.7

1 year ago
  • Fix potential unhandled promise rejection in useRecoilCallback() (#2075)
  • Add OSS support for GateKeeper feature toggling via RecoilEnv.RECOIL_GKS_ENABLED (#2078)
  • Fix resolving suspense of async selectors used with SSR (#2073, #1960)
  • Fix SSR with some versions of React DOM used with Next.JS 13 (#2082, #2086)

0.7.6

1 year ago
  • Expose flag to disable "duplicate atom key" checking / logging, as it was too noisy in environments such as NextJS or some dev environments using Fast Refresh. (#733, #2020, #2046)
    • Import RecoilEnv from the recoil package, and set RecoilEnv.RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED = false in code to disable the checking and logging.
    • We also support process.env.RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=false in NodeJS environments such as NextJs
    • Caution: This disables all checks for duplicate atom keys including legitimate errors, so use with caution!
  • Workaround for React 18 environments with nested renderers that don't support useSyncExternalStore(). (#2001, #2010)

0.7.5

1 year ago
  • Fix useRecoilSnapshot() with React's Fast Refresh during development (#1891)
  • Fix useRecoilSnapshot() and recoil-sync with changed browser behavior starting with Chrome v104 (#1943, #1936)

0.7.4

1 year ago
  • Fix missing Flow types (#1857)
  • Cleanup memory leak when using atoms with selector defaults. (#1821, #1840, #1844)

0.7.3

1 year ago
  • Enable atoms and selectors to be used in family parameters (#1172)
  • Add parentStoreID_UNSTABLE to atom effects which is the ID of the parent store it cloned from, such as the host <RecoilRoot> store for useRecoilCallback() snapshots. (#1744)
  • Atom effects can initialize or set atoms to wrapped values (#1681)

0.7.2

2 years ago
  • Selector cache lookup optimizations (#1720, #1736)
  • Allow async selectors to re-evaluate when async dependencies are discovered with stale state (#1736)

0.7.1

2 years ago

Typing

  • Add explicit children prop to <RecoilRoot> and useRecoilBridgeAcrossReactRoots_UNSTABLE() for TypeScript for @types/react with React 18 (#1718, #1717, #1726, #1731)
  • Update typing for family parameters to better support Map, Set, and classes with toJSON(). (#1709, #1703)

Fixes

  • Avoid dev-mode console error with React 18 when using shared async selectors across multiple <RecoilRoot>'s. (#1712)
  • Cleanup potential memory leak when using async selectors. (#1714)
  • Fix potentially hung async selectors when shared across multiple roots that depend on atoms initialized with promises that don't resolve. (#1714)

0.7.0

2 years ago

New Features

  • The default value is now optional for atom() and atomFamily(). If not provided the atom will initialize to a pending state. (#1639)
  • Add getStoreID() method to Snapshot (#1612)
  • Publish RecoilLoadable.loading() factory for making an async Loadable which never resolves. (#1641)

Breaking Changes

  • Selector's get() and Atom's default can now accept a Loadable to put the node in that state. If you wish to store a Loadable, Promise, or RecoilValue directly you can wrap it with selector.value() or atom.value(). (#1640)
  • useRecoilCallback() now provides a snapshot for the latest state when the callback is called instead of the latest rendered state, which had issues (#1610, #1604)

Improvements / Optimizations

  • Automatically retain snapshots for the duration of async callbacks. (#1632)
  • Optimization for more selector dependencies. 2x improvement with 100 dependencies, 4x with 1,000, and now able to support 10,000+. (#1651, #1515, #914)
  • Better error reporting when selectors provide inconsistent results (#1696)

Fixes

  • Avoid spurious console errors from effects when calling setSelf() from onSet() handlers. (#1589, #1582)
  • Freezing user values in dev mode now works in JS environments without the Window interface. (#1571)

0.6.1

2 years ago

Fix postInstall script

0.6.0

2 years ago

React 18

  • Leverage new React 18 APIs for improved safety and optimizations. (#1488)
  • Fixes for <StrictMode> (#1473, #1444, #1509).
  • Experimental support for useTransition() using hooks with _TRANSITION_SUPPORT_UNSTABLE suffix. (#1572, #1560)
  • Recoil updates now re-render earlier:
    • Recoil and React state changes from the same batch now stay in sync. (#1076)
    • Renders now occur before transaction observers instead of after.

New Features

  • Add refresh() to the useRecoilCallback() interface for refreshing selector caches. (#1413)
  • Callbacks from selector's getCallback() can now mutate, refresh, and transact Recoil state, in addition to reading it, for parity with useRecoilCallback(). (#1498)
  • Recoil StoreID's for <RecoilRoot> and Snapshot stores accessible via useRecoilStoreID() hook (#1417) or storeID parameter for atom effects (#1414).
  • RecoilLoadable.all() and RecoilLoadable.of() now accept either literal values, async Promises, or Loadables. (#1455, #1442)
  • Add .isRetained() method for Snapshots and check if snapshot is already released when using .retain() (#1546)

Other Fixes and Optimizations

  • Reduce overhead of snapshot cloning
    • Only clone the current snapshot for callbacks if the callback actually uses it. (#1501)
    • Cache the cloned snapshots from callbacks unless there was a state change. (#1533)
  • Fix transitive selector refresh for some cases (#1409)
  • Fix some corner cases with async selectors and multiple stores (#1568)
  • Atom Effects
    • Run atom effects when atoms are initialized from a set during a transaction from useRecoilTransaction_UNSTABLE() (#1466, #1569)
    • Atom effects are cleaned up when initialized by a Snapshot which is released. (#1511, #1532)
    • Unsubscribe onSet() handlers in atom effects when atoms are cleaned up. (#1509)
    • Call onSet() when atoms are initialized with <RecoilRoot initializeState={...} > (#1519, #1511)
  • Avoid extra re-renders in some cases when a component uses a different atom/selector. (#825)
  • <RecoilRoot> will only call initializeState() once during the initial render. (#1372)
  • Lazily compute the properties of useGetRecoilValueInfo_UNSTABLE() and Snapshot#getInfo_UNSTABLE() results (#1549)
  • Memoize the results of lazy proxies. (#1548)

Breaking Changes

  • Rename atom effects from effects_UNSTABLE to just effects, as the interface is mostly stabilizing. (#1520)
  • Atom effect initialization takes precedence over initialization with <RecoilRoot initializeState={...} >. (#1509)
  • useGetRecoilValueInfo_UNSTABLE() and Snapshot#getInfo_UNSTABLE() always report the node type. (#1547)
  • The 0.3 release introduced the need to retain Snapshots for later use, but it was mostly a warning. Now it is necessary to retain a Snapshot for asynchronous selectors to resolve. See the documentation here and here. Future releases will further enforce this as garbage collection is released.