New
0.6.0
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_UNSTABLEsuffix. (#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 theuseRecoilCallback()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 withuseRecoilCallback(). (#1498) - Recoil StoreID's for
<RecoilRoot>andSnapshotstores accessible viauseRecoilStoreID()hook (#1417) orstoreIDparameter for atom effects (#1414). RecoilLoadable.all()andRecoilLoadable.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)
- Run atom effects when atoms are initialized from a set during a transaction from
- Avoid extra re-renders in some cases when a component uses a different atom/selector. (#825)
<RecoilRoot>will only callinitializeState()once during the initial render. (#1372)- Lazily compute the properties of
useGetRecoilValueInfo_UNSTABLE()andSnapshot#getInfo_UNSTABLE()results (#1549) - Memoize the results of lazy proxies. (#1548)
Breaking Changes
- Rename atom effects from
effects_UNSTABLEto justeffects, as the interface is mostly stabilizing. (#1520) - Atom effect initialization takes precedence over initialization with
<RecoilRoot initializeState={...} >. (#1509) useGetRecoilValueInfo_UNSTABLE()andSnapshot#getInfo_UNSTABLE()always report the nodetype. (#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.