React: コンポーネントがサーバー側でレンダリングされると、useCallbackは未定義を返します

作成日 2018年11月15日  ·  4コメント  ·  ソース: facebook/react

機能をリクエストしバグを報告しますか?

バグ。

現在の動作は何ですか?

React.useCallbackは、コンポーネントがサーバー側でレンダリングされるときにundefined React.useCallback返します。

現在の動作がバグである場合は、再現する手順と、可能であれば問題の最小限のデモを提供してください。 以下のJSFiddle(https://jsfiddle.net/Luktwrdm/)またはCodeSandbox(https://codesandbox.io/s/new)の例へのリンクを貼り付けます。

このバグは、 useCallbackを使用してReactコンポーネントを作成することで再現できます。 サーバーに戻り値を記録すると、ブラウザーで関数が正しく返される一方で、 undefinedが生成されます。

あなたはこのCodeSandboxでこのバグを観察することができます。 https://codesandbox.io/s/r557kww6wnの戻り値というアプリケーションが正しくコンソールを見て、文字列のバグがレンダリングされ、次のように表示されますuseCallbackあるundefined

これはまったく同じアプリケーションですが、クライアントでレンダリングされます: https://codesandbox.io/s/xvwv797pxz関数はコンソールに正しく記録されます。

期待される動作は何ですか?

React.useCallbackは、 undefinedではなく、メモ化されたコールバックを返す必要があります。

Reactのどのバージョン、およびどのブラウザ/ OSがこの問題の影響を受けますか?

  • 反応: 16.7.0-alpha.2
  • react-dom:16.7.0-alpha.2
Hooks Bug

最も参考になるコメント

これはバグだと思います。 そのコードコメントは間違っています。 私の理解では、レンダリングフェーズのコールバックにuseCallbackを使用するのは正しいことです。

全てのコメント4件

これは意図的な動作です。

コールバックはサーバー環境では実行されません。

コールバックはonClickなどのイベントハンドラーで使用するためのものであり、SSR中には意味がないため、Reactはそれらを追跡する必要がなく、使用されるリソースを解放することが理論的根拠だと思います。決して使用されないフックを追跡することによって不必要に。

水分補給するとき、コールバックがそこにあるので、心配しないでください。

しかし、私はあなたが正確に何をしようとしているのか尋ねてもいいですか?

ありがとう@ arianon👌私は、useMappedStateでuseCallbackを使用するというredux-react-hookの提案に従っていました。 概念的には、私がメモしている関数は実際にはコールバックではありません。 この用語はさまざまな文脈で使用される傾向があるため、最初は注意を払いませんでした。 また、ドキュメントには次のように記載されています。

useCallback(fn, inputs)useMemo(() => fn, inputs)と同等です。

docsリポジトリで問題を開いて、更新を提案します😉ありがとうございます!

これはバグだと思います。 そのコードコメントは間違っています。 私の理解では、レンダリングフェーズのコールバックにuseCallbackを使用するのは正しいことです。

AFAICTサーバー側で実行してはならないのは、Effectsとref属性の初期化だけです。 動作するuseCallbackは、たとえば、レンダリングプロップHOCパターンにとって重要です。これは、長い間エコシステムに存在し続けます。

このページは役に立ちましたか?
0 / 5 - 0 評価