跳至主要内容

Recoil 0.7

·阅读时长 3 分钟

Recoil 0.7 提供了一些小的 API 改进、选择器优化和其他修复。

新功能

Atom 默认值可选

现在可以选择是否为 Atom 提供默认值。如果未提供默认值,则 Atom 将保持在“待定”状态(例如触发 React Suspense),直到它被设置。 (#1639)

这可以帮助避免笨拙的类型(例如不必要地使类型可空)或笨拙的默认值占位符。一个最小的字符串 Atom 示例可能是

atom<string>({key: 'MyString'});

当 Atom 使用 Atom 效果初始化且可能不需要默认值时,这也很有用

atom({
key: 'MyQuery',
effects: [
dbSyncEffect({query, variables}),
],
});

其他新功能

  • .getStoreID() 方法添加到 Snapshot (#1612)
  • 发布 RecoilLoadable.loading() 工厂,用于制作永远不会解析的异步 Loadable。 (#1641)

改进/优化

在异步回调期间自动保留快照。

现在不再需要手动保留来自 useRecoilCallback() 的异步回调的快照。 (#1632)

  const myCallback = useRecoilCallback(({snapshot}) => async () => {
// No longer necessary to retain() here
await something;
... use snapshot ...
});

如果要保存快照或从某些其他计划处理程序的闭包状态中引用它,则仍然需要 手动保留它

其他改进/优化

  • 针对更多选择器依赖项进行扩展的优化。具有 100 个依赖项时改进 2 倍,具有 1,000 个依赖项时改进 4 倍,现在能够支持 10,000 多个依赖项。 (#1651, #1515, #914)
  • 当用户选择器实现提供不一致的结果时,更好的错误报告 (#1696)

重大更改

选择器评估或 Atom 默认值可以使用 Loadable 对象

现在,选择器 get() 评估回调或 Atom default 属性可以使用 Loadable 对象。 (#1640) 这可以使它们更干净地接受同步错误状态

atom({
key: 'Key',
default: RecoilLoadable.error(new Error('ERROR')),
});

或映射的 Loadable 或占位符

selector({
key: 'Key',
get: ({get}) => {
const queryLoadable = get(noWait(myQuerySelector));
if (queryLoadable.state === 'loading') {
return PLACEHOLDER;
}
return queryLoadable; // Pass on the query results or error state.
}
})

如果希望将选择器值显式评估为 PromiseLoadableRecoilState 类型对象,则现在可以使用 selector.value()atom.value() 将它们包装起来。

selector({
key: 'Key',
get: ({get}) => {
// Returns an immediate synchronous value
return selector.value(Promise.resolve('Promise as a value'));
},
});

这只是一项很小的更改。它有助于使 API 在处理 PromiseLoadable 等包装器方面更加一致,但尚未在整个 API 中提供。但是,它有助于为将来潜在的能力奠定基础,即显式地将 Atom 和选择器设置为异步值或错误状态。

其他重大更改

修复

  • 在开发模式下冻结用户值现在可以在没有 Window 接口的 JS 环境中工作。 (#1571)
  • 避免从 onSet() 处理程序调用 setSelf() 时,Atom 效果出现虚假控制台错误。 (#1589, #1582)