ΠΡΠΈΠ²Π΅Ρ, ΠΏΡΠΎΡΡΠΎ ΠΈΠ· Π»ΡΠ±ΠΎΠΏΡΡΡΡΠ²Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ useMemo
Π²ΠΌΠ΅ΡΡΠΎ useRef
ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ:
ΠΡΠΈΠΌΠ΅Ρ:
const ref = useRef(null);
const ref2 = useMemo(() => { current: null }, []);
ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΎΠ±Π΅ ΡΡΡΠ»ΠΊΠΈ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΊΠ°ΠΊ DOM ref ΠΈ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π² ΠΊΠ»Π°ΡΡΠ°Ρ
. ΠΠΎΡΠ΅ΠΌΡ ΡΠΎΠ³Π΄Π° 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: ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ.
ΠΡ _ ΠΌΠΎΠΆΠ΅ΡΠ΅_ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΡΠ»ΠΊΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½ΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ
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: ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ.