[Suggestion]: Document that hooks can be called after a conditional `throw`
まだ誰も着手していません。
- 主要言語
- JavaScript
- スター
- 11.8k
- フォーク
- 7.9k
- 平均マージ
- 1日 11時間
- マージ済み PR(30日)
- 11
説明
Summary
I don't believe it is documented anywhere that calling a hook after a conditional throw statement is not a violation of the rules of hooks. If this is a valid pattern, it should be documented. If it is not, the Eslint rule rules-of-hooks should warn for it.
Page
Rules of hooks
Details
I realised this is effectively the pattern when using Next.js app router notFound(), which throws an Error in the component render. I had assumed this not being flagged by the rules-of-hooks was a limitation of the Next.js eslint plugin, but actually, this is not flagged as an issue with a standard throw:
const Component = ({ someOtherCondition }) => {
const [foo, setFoo] = useState();
if (someOtherCondition) throw new Error();
const [bar, setBar] = useState();
return (<>...</>);
};
My assumption is this is a valid pattern as if someOtherCondition becomes true, the error will be thrown up the call stack to the nearest error boundary, and the render that was in-progress will be discarded. There is not a case to have this conditional throw call more hooks than the previous render, only less. The rules of hooks state:
It’s not supported to call Hooks (functions starting with use) in any other cases, for example:
🔴 Do not call Hooks inside conditions or loops.
🔴 Do not call Hooks after a conditional return statement.
In the example above, the second useState call comes after a conditional throw statement. Not quite either of the cases in documentation.
If this is a valid pattern, it should be mentioned in the docs, with potential warnings about it not being a recommended workaround to conditionally call hooks (as there is no way to resume execution of the other path of the conditional once an error is thrown from the component).
If this isn't a valid pattern, it should be flagged by the eslint rule.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Rules of Hooks ページと、issue に記載されている rules-of-hooks のドキュメント化された動作から始めます。条件付き throw の例を再現し、その後、ページに明確化が必要なのか、それとも ESLint ルールを変更すべきなのかを判断します。動作と、それに関して意図されているガイダンスが解決され、適切な場所に反映されていれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- eslint, javascript, next.js, react
- 領域
- documentation
- issue の種類
- ドキュメント
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 35/100