Skip to content

Releases: facebookexperimental/Recoil

0.7.7

11 Apr 21:16
Compare
Choose a tag to compare
  • 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

11 Oct 23:01
Compare
Choose a tag to compare
  • 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

11 Aug 22:58
Compare
Choose a tag to compare
  • 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

22 Jun 01:33
Compare
Choose a tag to compare
  • Fix missing Flow types (#1857)
  • Cleanup memory leak when using atoms with selector defaults. (#1821, #1840, #1844)

0.7.3

02 Jun 07:49
Compare
Choose a tag to compare
  • 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

14 Apr 21:59
Compare
Choose a tag to compare
  • Selector cache lookup optimizations (#1720, #1736)
  • Allow async selectors to re-evaluate when async dependencies are discovered with stale state (#1736)

0.7.1

13 Apr 03:29
Compare
Choose a tag to compare

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

01 Apr 07:11
Compare
Choose a tag to compare

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

31 Jan 21:05
Compare
Choose a tag to compare

Fix postInstall script

0.6.0

29 Jan 07:46
Compare
Choose a tag to compare

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.