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.
}
})
如果希望将选择器值显式评估为 Promise
、Loadable
或 RecoilState
类型对象,则现在可以使用 selector.value()
或 atom.value()
将它们包装起来。
selector({
key: 'Key',
get: ({get}) => {
// Returns an immediate synchronous value
return selector.value(Promise.resolve('Promise as a value'));
},
});
这只是一项很小的更改。它有助于使 API 在处理 Promise
和 Loadable
等包装器方面更加一致,但尚未在整个 API 中提供。但是,它有助于为将来潜在的能力奠定基础,即显式地将 Atom 和选择器设置为异步值或错误状态。
其他重大更改
useRecoilCallback()
现在提供最新状态的快照,而不是最新渲染状态的快照,后者存在错误 (#1610, #1604)