機能をリクエストしバグを報告しますか?
バグ
現在の動作は何ですか?
次のすべての条件が満たされたコンポーネントについて、コンソールに警告が表示されます。
React.memo
を使用してメモ化されますその警告のテキスト: Warning: ComponentName: Rendered more hooks than during the previous render. This is not currently supported and may lead to unexpected behavior.
現在の動作がバグである場合は、再現する手順と、可能であれば問題の最小限のデモを提供してください。 以下のJSFiddle(https://jsfiddle.net/Luktwrdm/)またはCodeSandbox(https://codesandbox.io/s/new)の例へのリンクを貼り付けます。
https://codesandbox.io/s/71lr16j491
期待される動作は何ですか?
フックのルールが満たされているため、警告は表示されません。 また、 React.memo
が使用されているかどうかに関係なく、動作は一貫している必要があります。
Reactのどのバージョン、およびどのブラウザ/ OSがこの問題の影響を受けますか?
React 16.8.1
私が最初に読んだのは、これはバグです。
バージョン16.8.1
これとまったく同じ問題に気づきました。 ただし、私の場合、 Promise
がスローされる場所とSuspense
コンポーネントの間にメモ化されたコンポーネントはありません。
Promise
がスローされて警告が表示される前に、コンポーネントは上部に2つのフックを宣言します。 フックと同じことが起こる前に、 Promise
を上に投げてコールを移動しました。 コンポーネント内にPromise
スローされていない場合、警告は消えます。
私のコンポーネントのモックは次のようなものです。
function Component(props) {
const [state, setState] = useState()
useEffect(...)
// Promise is thrown somewhere after these two
// hooks on top, but before the return statement.
return (
...
)
}
これを確認できます。
16.8.2で修正されました。
https://codesandbox.io/s/vmmkmvo6pl
最も参考になるコメント
16.8.2で修正されました。
https://codesandbox.io/s/vmmkmvo6pl