Recoil 0.3
· One min read
我们很高兴地宣布 Recoil 0.3 的发布,它具有更灵活的 RecoilRoot 嵌套,回调生成,内存管理的准备、优化及错误修复。
#
新特性- 现在,你可以创建一个 RecoilRoot,如果本身已存在 RecoilRoot 的话,它可以落其外层的 root 上。这使得你可以创建可复用的 Recoil 组件,可以应用在 Recoil 比较大的应用程序中,当然也可以选择不使用。(#973)
- 你现在可以从 selector 中返回 Recoil 的回调。(#989)
#
重大更新:为内存管理做准备Recoil 的下一个版本将有巨大的的 API 变化。如果你的代码有需要更新的部分,升级到该版本时,会在开发构建中发出一个控制台警告;大多数应用不需要修改代码。
当我们发布内存管理时,快照 (比如你作为 useRecoilCallback()
的参数得到的快照) 将只在它们被创建的时间段内有效。如果你想把快照保留更长的时间,你需要手动保留,然后释放它。
const release = snapshot.retain();try { await someAsyncWork(snapshot);} finally { release();}
在 0.3.0 中,如果你使用一个没有被保留的快照,你会在开发中得到一个控制台警告。在生产中的行为没有变化。在下一个版本中,它将会抛出一个异常,无论是在开发还是生产中。
应该尽可能避免保留快照,因为只要快照被保留,就会阻止所有 atom 的内存回收。相反,在进入异步之前,只提取你需要的值。
#
错误修复、性能和其他改进- 减少了使用
atomFamily
时的开销。一个有数千个 atom 的应用程序减少了 200MB 的内存使用。 - 修复了一个错误,即从异步 selector 抛出的错误没有被 React 错误边界所捕获。(#998, #1017)
- 实验性的 Atom Effects
onSet()
在从setSelf()
初始化 Promise 或从同一onSet()
处理程序触发时不再被调用。([#974](https://github.com/facebookexperimental/Recoil/pull/974), [#979](https://github.com/facebookexperimental/Recoil/pull/979), [#953](https://github.com/facebookexperimental/Recoil/pull/953), [#986](https://github.com/facebookexperimental/Recoil/pull/986)) - 改进了对 Safari 的支持。(#967, #609)
- 存储在 selector 中的值现在在开发模式下被冻结。(#911)
- 改进了 TypeScript 对
Loadable
的支持。