こんにちは、好奇心から、次のように行う場合、 useRef
代わりにuseMemo
を使用できます。
例:
const ref = useRef(null);
const ref2 = useMemo(() => { current: null }, []);
どちらの参照も、DOM参照としても、クラスのインスタンスフィールドと同様に変更可能な値としても、問題なく機能するように見えます。 useRef
とuseMemo
ReactFiberHooks.jsコードを考慮すると、 useRef
がuseMemo
とは異なる方法で実装されるのはなぜですか?
ありがとう!
この方法でrefオブジェクトを作成することもできますが、 useMemo
も依存関係を追跡および比較するため、効率が低下します。 (空の依存関係配列を指定した場合でも、メモフックの基になるデータ構造には追加の値のためのスペースがあります。)
これを説明するために、 useRef
の実装を比較できます。
https://github.com/facebook/react/blob/434770c3b4b94315c789234c27ed9dc2ec8a78ad/packages/react-reconciler/src/ReactFiberHooks.js#L907 -L920
useMemo
:
https://github.com/facebook/react/blob/434770c3b4b94315c789234c27ed9dc2ec8a78ad/packages/react-reconciler/src/ReactFiberHooks.js#L1126 -L1156
両方のフックは頻繁に使用されるため、実装が異なるように:smile:を最適に実行することが重要です。
この方法でrefオブジェクトを作成することはできますが、
useMemo
も依存関係を追跡および比較するため、効率が低下します。 (空の依存関係配列を指定した場合でも、メモフックの基になるデータ構造には追加の値のためのスペースがあります。)これを説明するために、
useRef
の実装を比較できます。
https://github.com/facebook/react/blob/434770c3b4b94315c789234c27ed9dc2ec8a78ad/packages/react-reconciler/src/ReactFiberHooks.js#L907 -L920
useMemo
:
https://github.com/facebook/react/blob/434770c3b4b94315c789234c27ed9dc2ec8a78ad/packages/react-reconciler/src/ReactFiberHooks.js#L1126 -L1156両方のフックが頻繁に使用されるため、実装が異なるように最適に機能することが重要です😄。
こんにちは、このようにコードをフォーマットする方法は?
@ yaofly2012特定のファイルリビジョンと行番号にリンクする場合、GitHubはそのようにリンクをフォーマットします。
最も参考になるコメント
この方法でrefオブジェクトを作成することもできますが、
useMemo
も依存関係を追跡および比較するため、効率が低下します。 (空の依存関係配列を指定した場合でも、メモフックの基になるデータ構造には追加の値のためのスペースがあります。)これを説明するために、
useRef
の実装を比較できます。https://github.com/facebook/react/blob/434770c3b4b94315c789234c27ed9dc2ec8a78ad/packages/react-reconciler/src/ReactFiberHooks.js#L907 -L920
useMemo
:https://github.com/facebook/react/blob/434770c3b4b94315c789234c27ed9dc2ec8a78ad/packages/react-reconciler/src/ReactFiberHooks.js#L1126 -L1156
両方のフックは頻繁に使用されるため、実装が異なるように:smile:を最適に実行することが重要です。