機能をリクエストしバグを報告しますか?
質問。 これは #14563 にも関連している可能性があります。
フックからサスペンドをトリガーするにはどうすればよいですか?
なぜ質問が出たのですか?
この質問は、 react-i18next
使用中に出てきました。 react-i18next
の最近の更新により、 useTranslation
フックが提供されました。これにより、現在の翻訳を取得でき、まだロードされていない翻訳名前空間のロードもトリガーされます(コード分割のようなもの)。
翻訳がまだロードされていない場合を処理するために、 useTranslation
フックはSuspense
をトリガーする約束をスローします。これは、既存の反応機能と完全に統合されているため、実際には非常に優れています。
ただし、 useTranslation
フックを呼び出した後にさらにフックを使用している場合、 useTranslation
がpromiseをスローすると、これらの他のフックはレンダリングされません。 翻訳が読み込まれると、フックはそれ以上スローされなくなり、フックの量が変更されたことを示す大きな赤い警告が表示されます。
例
const Component = () => {
const [t] = useTranslation('translationnamespace');
const [count, setCount] = useState(0);
return (
<div onClick={() => setCount(count + 1)}>
{t('The count is:')} {count}
</div>
);
};
translationnamespace
がまだロードされていない場合、 useTranslation
がスローされ、 useState
がレンダリングされません。 translationnamespace
がロードされると、 useTranslation
はスローされなくなり、 useState
がレンダリングされ、警告が発生します。
一般的なケース
したがって、この質問はreact-i18nextにのみ適用されるのではなく、サスペンスをトリガーしたいすべてのフックに適用されます。 これをどのように行うのでしょうか。また、フックを条件付きでレンダリングしてはならないという現在の「フックのルール」とどのように統合するのでしょうか。
一時停止した場合にエラーが発生するのは間違いのようです。 意図的ではなかったAfaik。
了解しました。知っておいてください。
また、一時停止の場合にすべてのフックをレンダリングしないことが定義された動作であることを文書化することもできます。 しかし、これは、データフェッチメカニズムとして一時停止が正式に導入された時点で行われると思います。
実際には16.8.2で修正したと思います。 そうでない場合は再生ケースで新しいものを開けてください。
最も参考になるコメント
実際には16.8.2で修正したと思います。 そうでない場合は再生ケースで新しいものを開けてください。