メインコンテンツにスキップ

Recoil 0.7

·3分で読めます

Recoil 0.7では、いくつかのマイナーなAPIの改善、セレクターの最適化、その他の修正を提供しています。

新機能

Atomのデフォルトはオプションになりました

atomにデフォルト値を設定することがオプションになりました。デフォルトが指定されていない場合、atomは設定されるまで「保留中」の状態(例:React Suspenseをトリガー)のままになります。(#1639

これにより、型付けの不都合(たとえば、型を不必要にnullableにすること)や、デフォルトの不都合なプレースホルダー値を回避できます。最小限の文字列atomの例を次に示します。

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

これは、atomがatomエフェクトで初期化され、デフォルトが必要ない場合にも役立ちます。

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

その他の新機能

  • Snapshot.getStoreID() メソッドを追加しました(#1612
  • 非同期の Loadable を作成するための RecoilLoadable.loading() ファクトリを公開しました。これは決して解決されません。(#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.
}
})

セレクター値を明示的にPromiseLoadable、またはRecoilState型のオブジェクトに評価する場合は、selector.value()またはatom.value()でラップできるようになりました。

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

これはマイナーな変更にすぎません。PromiseLoadableなどのラッパーを処理するためのAPIの一貫性を高めるのに役立ちますが、まだAPI全体で使用できるわけではありません。しかし、これは、atomとセレクターを非同期値またはエラー状態に明示的に設定する将来の可能性への足がかりとなります。

その他の破壊的変更

  • useRecoilCallback()は、バグがあった最新のレンダリングされた状態の代わりに、最新の状態のスナップショットを提供するようになりました。(#1610#1604

修正

  • 開発モードでのユーザー値のフリーズは、WindowインターフェイスのないJS環境で機能するようになりました。(#1571
  • onSet()ハンドラーからsetSelf()を呼び出すときに、atomエフェクトからの誤ったコンソールエラーを回避します。(#1589#1582