Reactã®useCallbackããã¯ããã¹ã¿ãŒãã颿°ã®ããã©ãŒãã³ã¹ãæé©åãäžèŠãªåã¬ã³ããªã³ã°ãé²ããå¹ççã§é«æ§èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãã
React useCallback: 颿°ã®ã¡ã¢åãšäŸåé¢ä¿ã®æé©å
Reactã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®åŒ·åãªJavaScriptã©ã€ãã©ãªã§ãããäžçäžã®éçºè
ã«åºã䜿çšãããŠããŸããå¹ççãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§éèŠãªåŽé¢ã®äžã€ããã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ç®¡çã§ããç¹ã«è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãäžèŠãªåã¬ã³ããªã³ã°ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããReactã¯ãéçºè
ã颿°ã®ããã©ãŒãã³ã¹ãæé©åãã颿°ãåäœæãããã¿ã€ãã³ã°ãå¶åŸ¡ããã®ã«åœ¹ç«ã€useCallbackã®ãããªããŒã«ãæäŸããŠãããããã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³å
šäœã®å¹çãåäžãããŸãããã®ããã°èšäºã§ã¯ãuseCallbackããã¯ãæãäžãããã®ç®çãå©ç¹ããããŠReactã³ã³ããŒãã³ããæé©åããããã«å¹æçã«äœ¿çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã
useCallbackãšã¯ïŒ
useCallbackã¯ã颿°ãã¡ã¢åããReactããã¯ã§ããã¡ã¢åãšã¯ãé«ã³ã¹ããªé¢æ°åŒã³åºãã®çµæããã£ãã·ã¥ããå
¥åã倿ŽãããŠããªãåŸç¶ã®åŒã³åºãã§ã¯ãã£ãã·ã¥ãããçµæãè¿ãããã©ãŒãã³ã¹æé©åæè¡ã§ããReactã®æèã§ã¯ãuseCallbackã¯é¢æ°ã³ã³ããŒãã³ãå
ã§ã®äžèŠãªé¢æ°ã®åäœæãé²ãã®ã«åœ¹ç«ã¡ãŸããããã¯ãåã³ã³ããŒãã³ãã«é¢æ°ãããããã£ãšããŠæž¡ãå Žåã«ç¹ã«äŸ¿å©ã§ãã
åºæ¬çãªæ§æã¯æ¬¡ã®ãšããã§ãïŒ
const memoizedCallback = useCallback(
() => {
// Function logic
},
[dependency1, dependency2, ...]
);
äž»èŠãªéšåãåè§£ããŠã¿ãŸãããïŒ
memoizedCallback: ã¡ã¢åããã颿°ãä¿æãã倿°ã§ããuseCallback: Reactããã¯ã§ãã() => { ... }: ã¡ã¢åããã颿°ã§ããå®è¡ãããããžãã¯ãå«ãŸããŸãã[dependency1, dependency2, ...]: äŸåé åã§ããã¡ã¢åããã颿°ã¯ãããããã®äŸåé¢ä¿ã倿Žãããå Žåã«ã®ã¿åäœæãããŸããäŸåé åã空ïŒ[]ïŒã®å Žåã颿°ã¯ååã¬ã³ããªã³ã°æã«äžåºŠã ãäœæããããã®åŸã®ãã¹ãŠã®ã¬ã³ããªã³ã°ã§åããŸãŸã§ãã
ãªãuseCallbackã䜿çšããã®ãïŒãã®å©ç¹
useCallbackã䜿çšãããšãReactã¢ããªã±ãŒã·ã§ã³ãæé©åããããã«ããã€ãã®å©ç¹ããããŸãïŒ
- äžèŠãªåã¬ã³ããªã³ã°ã®é²æ¢ïŒ äž»ãªå©ç¹ã¯ãåã³ã³ããŒãã³ããäžå¿
èŠã«åã¬ã³ããªã³ã°ãããã®ãé²ãããšã§ãã颿°ãåã³ã³ããŒãã³ãã«ããããã£ãšããŠæž¡ããããšã
useCallbackã䜿çšããŠé¢æ°ãã¡ã¢åããªãéããReactã¯æ¯åã®ã¬ã³ããªã³ã°ã§ãããæ°ããããããã£ãšããŠæ±ããŸãã颿°ãåäœæããããšãä»ã®ããããã£ã倿ŽãããŠããªããŠãåã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããå¯èœæ§ããããŸããããã¯é倧ãªããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªãåŸãŸãã - ããã©ãŒãã³ã¹ã®åäžïŒ åã¬ã³ããªã³ã°ãé²ãããšã§ã
useCallbackã¯ã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ãåäžãããŸããããã¯ç¹ã«ãé »ç¹ã«åã¬ã³ããªã³ã°ããã芪ã³ã³ããŒãã³ããè€éãªåã³ã³ããŒãã³ããããã·ããªãªã§é¡èã§ããå€§èŠæš¡ãªããŒã¿ã»ããã管çããããé »ç¹ãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãåŠçãããããã¢ããªã±ãŒã·ã§ã³ã§ã¯ç¹ã«æå¹ã§ãã - ã«ã¹ã¿ã ããã¯ã®æé©åïŒ
useCallbackã¯ãã«ã¹ã¿ã ããã¯å ã§ããã¯ãè¿ã颿°ãã¡ã¢åããããã«ãã䜿çšãããŸããããã«ãããäŸåé¢ä¿ã倿Žãããªãéã颿°ãå€ãããªãããšãä¿èšŒããããããã®ã«ã¹ã¿ã ããã¯ã䜿çšããã³ã³ããŒãã³ãã§ã®äžèŠãªåã¬ã³ããªã³ã°ãé²ãã®ã«åœ¹ç«ã¡ãŸãã - å®å®æ§ãšäºæž¬å¯èœæ§ã®åäžïŒ 颿°ããã€äœæãããããå¶åŸ¡ããããšã§ã
useCallbackã¯ã¢ããªã±ãŒã·ã§ã³ã®ããäºæž¬å¯èœãªåäœã«è²¢ç®ããé »ç¹ã«å€ãã颿°ã«ãã£ãŠåŒãèµ·ããããäºæããªãå¯äœçšã®å¯èœæ§ãæžãããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãããã°ãšã¡ã³ããã³ã¹ã«åœ¹ç«ã¡ãŸãã
useCallbackã®ä»çµã¿ïŒè©³çްãªè§£èª¬
useCallbackãåŒã³åºããããšãReactã¯äŸåé
åå
ã®ããããã®äŸåé¢ä¿ãååã®ã¬ã³ããªã³ã°ãã倿Žããããã©ããããã§ãã¯ããŸããäŸåé¢ä¿ã倿ŽãããŠããªãå ŽåãuseCallbackã¯ååã®ã¬ã³ããªã³ã°ããã¡ã¢åããã颿°ãè¿ããŸããããããã®äŸåé¢ä¿ã倿Žãããå ŽåãuseCallbackã¯é¢æ°ãåäœæããæ°ãã颿°ãè¿ããŸãã
ãã®ããã«èããŠã¿ãŠãã ããïŒé¢æ°ãåºãç¹å¥ãªèªå販売æ©ããããšããŸããããªãã¯ãã®æ©æ¢°ã«ææã®ãªã¹ãïŒäŸåé¢ä¿ïŒãæž¡ããŸãããããããã®ææãå€ãã£ãŠããªããã°ãæ©æ¢°ã¯ååãšåã颿°ãããªãã«ãããŸããããææãäžã€ã§ãå€ãã£ãŠããã°ãæ©æ¢°ã¯æ°ãã颿°ãäœæããŸãã
äŸïŒ
import React, { useCallback, useState } from 'react';
function ChildComponent({ onClick }) {
console.log('ChildComponent re-rendered');
return (
);
}
function ParentComponent() {
const [count, setCount] = useState(0);
// Without useCallback - this will create a new function on every render!
// const handleClick = () => {
// setCount(count + 1);
// };
// With useCallback - the function only re-creates when 'setCount' changes
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]); // 'count' is the dependency
console.log('ParentComponent re-rendered');
return (
Count: {count}
);
}
export default ParentComponent;
ãã®äŸã§ã¯ãuseCallbackããªãå ŽåãhandleClickã¯ParentComponentãã¬ã³ããªã³ã°ããããã³ã«æ°ãã颿°ã«ãªããŸããããã«ãããParentComponentãåã¬ã³ããªã³ã°ããããã³ã«ãã¯ãªãã¯ãã³ãã©èªäœãå€ãã£ãŠããªããŠãChildComponentãåã¬ã³ããªã³ã°ãããŠããŸããŸããuseCallbackã䜿çšãããšãhandleClickã¯äŸåé¢ä¿ã倿Žããããšãã«ã®ã¿å€ãããŸãããã®å ŽåãäŸåé¢ä¿ã¯ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããšãã«å€ããcountã§ãã
useCallbackã䜿çšããã¿ã€ãã³ã°ïŒãã¹ããã©ã¯ãã£ã¹
useCallbackã¯åŒ·åãªããŒã«ã§ãããéå°ãªæé©åãäžå¿
èŠãªè€éããé¿ããããã«æŠç¥çã«äœ¿çšããããšãéèŠã§ãããã€ããã€äœ¿çšããªããã«ã€ããŠã®ã¬ã€ãã¯æ¬¡ã®ãšããã§ãïŒ
- 䜿çšãã¹ãå ŽåïŒ
- ã¡ã¢åãããã³ã³ããŒãã³ãã«ããããã£ãšããŠé¢æ°ãæž¡ãå ŽåïŒ ãããæãäžè¬çã§éèŠãªäœ¿çšäŸã§ãã
React.memoã§ã©ãããããã³ã³ããŒãã³ãïŒãŸãã¯ã¡ã¢åã«useMemoã䜿çšããŠããã³ã³ããŒãã³ãïŒã«ããããã£ãšããŠé¢æ°ãæž¡ãå Žåãåã³ã³ããŒãã³ããäžå¿ èŠã«åã¬ã³ããªã³ã°ãããã®ãé²ãããã«useCallbackã䜿çšãã*å¿ èŠããããŸã*ãããã¯ãåã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãé«ã³ã¹ããªå Žåã«ç¹ã«éèŠã§ãã - ã«ã¹ã¿ã ããã¯ã®æé©åïŒ äŸåé¢ä¿ã倿Žãããªãéãåäœæãããªãããã«ãã«ã¹ã¿ã ããã¯å ã®é¢æ°ãã¡ã¢åããå Žåã
- ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã絶察çã«éèŠãªã»ã¯ã·ã§ã³ïŒäŸïŒå€ãã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã«ãŒãå
ïŒã§ã¯ã
useCallbackã䜿çšããããšã§å¹çãå€§å¹ ã«åäžãããããšãã§ããŸãã - åã¬ã³ããªã³ã°ãåŒãèµ·ããå¯èœæ§ã®ããã€ãã³ããã³ãã©ã§äœ¿çšããã颿°ïŒ ã€ãã³ããã³ãã©ã«æž¡ããã颿°ããåã¬ã³ããªã³ã°ãåŒãèµ·ããå¯èœæ§ã®ããç¶æ
倿Žã«çŽæ¥åœ±é¿ãäžããå Žåã
useCallbackã䜿çšããããšã§ã颿°ãåäœæããããçµæãšããŠã³ã³ããŒãã³ããäžå¿ èŠã«åã¬ã³ããªã³ã°ãããªãããã«ããããšãã§ããŸãã - 䜿çšãã¹ãã§ãªãå ŽåïŒ
- åçŽãªã€ãã³ããã³ãã©ïŒ ããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ãäžããããã¡ã¢åãããåã³ã³ããŒãã³ããšçžäºäœçšãããããªãåçŽãªã€ãã³ããã³ãã©ã®å Žåã
useCallbackã䜿çšãããšäžå¿ èŠãªè€éããå ããå¯èœæ§ããããŸãã䜿çšããåã«å®éã®ã€ã³ãã¯ããè©äŸ¡ããã®ãæåã§ãã - ããããã£ãšããŠæž¡ãããªã颿°ïŒ 颿°ãã³ã³ããŒãã³ãã®ã¹ã³ãŒãå ã§ã®ã¿äœ¿çšãããåã³ã³ããŒãã³ãã«æž¡ãããããåã¬ã³ããªã³ã°ãåŒãèµ·ãããããªæ¹æ³ã§äœ¿çšããããããªãå Žåãéåžžã¯ã¡ã¢åããå¿ èŠã¯ãããŸããã
- é床ãªäœ¿çšïŒ
useCallbackãé床ã«äœ¿çšãããšãã³ãŒããèªã¿ã«ãããçè§£ãã«ãããªãå¯èœæ§ããããŸããåžžã«ããã©ãŒãã³ã¹ã®å©ç¹ãšã³ãŒãã®å¯èªæ§ã®ãã¬ãŒããªããèæ ®ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠãå®éã®ããã©ãŒãã³ã¹ããã«ããã¯ãèŠã€ããããšãæåã®ã¹ããããšãªãããšãå€ãã§ãã
äŸåé¢ä¿ã®çè§£
äŸåé
åã¯useCallbackã®åäœã«ãšã£ãŠéåžžã«éèŠã§ãããã€ã¡ã¢åããã颿°ãåäœæããããReactã«äŒããŸããäŸåé¢ä¿ã誀ã£ãŠæå®ãããšãäºæããªãåäœããã°ã«ã€ãªããå¯èœæ§ããããŸãã
- ãã¹ãŠã®äŸåé¢ä¿ãå«ããïŒ ã¡ã¢åããã颿°å ã§äœ¿çšããã*ãã¹ãŠ*ã®å€æ°ãäŸåé åã«å«ããããã«ããŠãã ãããããã«ã¯ãç¶æ 倿°ãããããã£ãããã³é¢æ°ãäŸåãããã®ä»ã®å€ãå«ãŸããŸããäŸåé¢ä¿ãæ¬ èœããŠãããšã颿°ãå€ãå€ã䜿çšããå€ãã¯ããŒãžã£ãçºçããäºæž¬äžå¯èœãªçµæãåŒãèµ·ããå¯èœæ§ããããŸããReactã®ãªã³ã¿ãŒã¯ãäŸåé¢ä¿ã®æ¬ èœã«ã€ããŠãã°ãã°èŠåããŠãããŸãã
- äžèŠãªäŸåé¢ä¿ãé¿ããïŒ é¢æ°ãå®éã«äœ¿çšããªãäŸåé¢ä¿ãå«ããªãã§ãã ãããããã¯ã颿°ã®äžå¿ èŠãªåäœæã«ã€ãªããå¯èœæ§ããããŸãã
- äŸåé¢ä¿ãšç¶æ ã®æŽæ°ïŒ äŸåé¢ä¿ã倿Žããããšãã¡ã¢åããã颿°ã¯åäœæãããŸããããªãã®ç¶æ æŽæ°ãã©ã®ããã«æ©èœããããããäŸåé¢ä¿ãšã©ã®ããã«é¢é£ããŠããããçè§£ããŠãã ããã
- äŸïŒ
import React, { useCallback, useState } from 'react';
function MyComponent({ prop1 }) {
const [stateValue, setStateValue] = useState(0);
const handleClick = useCallback(() => {
// Include all dependencies: prop1 and stateValue
console.log('prop1: ', prop1, 'stateValue: ', stateValue);
setStateValue(stateValue + 1);
}, [prop1, stateValue]); // Correct dependency array
return ;
}
ãã®äŸã§ãäŸåé
åããprop1ãçç¥ããå Žåã颿°ã¯åžžã«prop1ã®åæå€ã䜿çšããããšã«ãªããããã¯ããããæãã åäœã§ã¯ãããŸããã
useCallback vs. useMemoïŒéãã¯äœãïŒ
useCallbackãšuseMemoã¯ã©ã¡ããã¡ã¢åã«äœ¿çšãããReactããã¯ã§ãããç°ãªãç®çãæãããŸãïŒ
useCallbackïŒ ã¡ã¢åããã*颿°*ãè¿ããŸããäŸåé¢ä¿ã倿Žãããªãéã颿°ãåäœæãããã®ãé²ãããšã§ã颿°ãæé©åããããã«äœ¿çšãããŸããäž»ã«é¢æ°ã®åç §ãšåã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ã«é¢é£ããããã©ãŒãã³ã¹æé©åã®ããã«èšèšãããŠããŸããuseMemoïŒ ã¡ã¢åããã*å€*ãè¿ããŸããèšç®çµæãã¡ã¢åããããã«äœ¿çšãããŸããããã«ãããæ¯åã®ã¬ã³ããªã³ã°ã§é«ã³ã¹ããªèšç®ãåå®è¡ããã®ãé¿ããããšãã§ããŸããç¹ã«åºåã颿°ã§ããå¿ èŠããªãå Žåã«æå¹ã§ãã
ã©ã¡ããéžã¶ãïŒ
- 颿°ãã¡ã¢åãããå Žåã¯
useCallbackã䜿çšããŸãã - èšç®ãããå€ïŒãªããžã§ã¯ããé
åãããªããã£ãå€ãªã©ïŒãã¡ã¢åãããå Žåã¯
useMemoã䜿çšããŸãã
useMemoã䜿çšããäŸïŒ
import React, { useMemo, useState } from 'react';
function MyComponent({ items }) {
const [filter, setFilter] = useState('');
// Memoize the filtered items - an array is the result
const filteredItems = useMemo(() => {
return items.filter(item => item.includes(filter));
}, [items, filter]);
return (
setFilter(e.target.value)} />
{filteredItems.map(item => (
- {item}
))}
);
}
ãã®äŸã§ã¯ãuseMemoã¯ãã£ã«ã¿ãªã³ã°æäœã®çµæã§ããfilteredItemsé
åãã¡ã¢åããŸããé
åã¯itemsãŸãã¯filterã®ããããã倿Žãããå Žåã«ã®ã¿åèšç®ãããŸããããã«ãããã³ã³ããŒãã³ãã®ä»ã®éšåã倿ŽãããŠããªã¹ããäžå¿
èŠã«åã¬ã³ããªã³ã°ãããã®ãé²ããŸãã
React.memoãšuseCallbackïŒåŒ·åãªçµã¿åãã
React.memoã¯ã颿°ã³ã³ããŒãã³ããã¡ã¢åããé«éã³ã³ããŒãã³ãïŒHOCïŒã§ããããããã£ã倿ŽãããŠããªãå Žåãã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãé²ããŸããuseCallbackãšçµã¿åãããããšã§ã匷åãªæé©åæ©èœãåŸãããŸãã
- ä»çµã¿ïŒ
React.memoã¯ãã³ã³ããŒãã³ãã«æž¡ãããããããã£ã®æµ ãæ¯èŒãå®è¡ããŸããããããã£ãïŒæµ ãæ¯èŒã«ããã°ïŒåãã§ããã°ãã³ã³ããŒãã³ãã¯åã¬ã³ããªã³ã°ãããŸãããããã§useCallbackãç»å ŽããŸãïŒããããã£ãšããŠæž¡ããã颿°ãã¡ã¢åããããšã§ãäŸåé¢ä¿ã倿Žãããªãéã颿°ãå€ãããªãããšãä¿èšŒããŸããããã«ãããReact.memoã¯ã¡ã¢åãããã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ã广çã«é²ãããšãã§ããŸãã - äŸïŒ
import React, { useCallback } from 'react';
// Memoized child component
const ChildComponent = React.memo(({ onClick, text }) => {
console.log('ChildComponent re-rendered');
return (
);
});
function ParentComponent() {
const [count, setCount] = React.useState(0);
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]);
return (
Count: {count}
);
}
ãã®äŸã§ã¯ãChildComponentã¯React.memoã§ã¡ã¢åãããŠããŸããonClickããããã£ã¯useCallbackã䜿çšããŠã¡ã¢åãããŠããŸãããã®èšå®ã«ãããChildComponentã¯handleClick颿°èªäœãåäœæããããšãïŒããã¯countã倿Žããããšãã«ã®ã¿çºçããŸãïŒãããã³textããããã£ã倿Žããããšãã«ã®ã¿åã¬ã³ããªã³ã°ãããããšãä¿èšŒãããŸãã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
åºæ¬ãè¶
ããŠãuseCallbackã䜿çšããéã«ã¯ãããã€ãã®é«åºŠãªãã¯ããã¯ãšèæ
®äºé
ã念é ã«çœ®ãå¿
èŠããããŸãïŒ
React.memoã§ã®ã«ã¹ã¿ã æ¯èŒããžãã¯ïŒReact.memoã¯ããã©ã«ãã§ããããã£ã®æµ ãæ¯èŒãè¡ããŸããã第2åŒæ°ãšããŠæ¯èŒé¢æ°ãæäŸããããšã§ãããããã£ã®æ¯èŒãã«ã¹ã¿ãã€ãºã§ããŸããããã«ãããã³ã³ããŒãã³ãããã€åã¬ã³ããªã³ã°ããããããã现ããå¶åŸ¡ã§ããŸããããã¯ãããããã£ãæ·±ãæ¯èŒãå¿ èŠãšããè€éãªãªããžã§ã¯ãã§ããå Žåã«åœ¹ç«ã¡ãŸãã- ãããã¡ã€ãªã³ã°ãšããã©ãŒãã³ã¹ããŒã«ïŒ React DevToolsããã©ãŠã¶ã®ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ããŸããããã«ããã
useCallbackããã®ä»ã®æé©åãã¯ããã¯ãæã广ãçºæ®ããé åãç¹å®ã§ããŸããChrome DevToolsã®React Profilerã®ãããªããŒã«ã¯ãã©ã®ã³ã³ããŒãã³ãããªãåã¬ã³ããªã³ã°ãããŠããããèŠèŠçã«ç€ºããŠãããŸãã - æ©ãããæé©åãé¿ããïŒ ã¢ããªã±ãŒã·ã§ã³ã®è³ãæã§
useCallbackã䜿ãå§ããªãã§ãã ããããŸããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸããæ¬¡ã«ãæãåé¡ãåŒãèµ·ãããŠããã³ã³ããŒãã³ãã®æé©åã«éäžããŸããæ©ãããæé©åã¯ã倧ããªããã©ãŒãã³ã¹åäžãªãã«ã³ãŒããããè€éã«ããå¯èœæ§ããããŸãã - ä»£æ¿æ¡ãæ€èšããïŒ å Žåã«ãã£ãŠã¯ãã³ãŒãåå²ãé
å»¶èªã¿èŸŒã¿ãä»®æ³åãªã©ã®ä»ã®ãã¯ããã¯ãã
useCallbackã䜿çšãããããããã©ãŒãã³ã¹åäžã«é©ããŠããããšããããŸããæé©åã®æ±ºå®ãè¡ãéã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å šäœçãªã¢ãŒããã¯ãã£ãèæ ®ããŠãã ããã - äŸåé¢ä¿ã®æŽæ°ïŒ äŸåé¢ä¿ã倿Žããããšãã¡ã¢åããã颿°ã¯åäœæãããŸãã颿°ãé«ã³ã¹ããªæäœãå®è¡ããå Žåããããããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸããäŸåé¢ä¿ã®åœ±é¿ãšããããã©ããããã®é »åºŠã§å€æŽãããããæ éã«æ€èšããŠãã ãããæã«ã¯ãã³ã³ããŒãã³ãã®èšèšãåèããããå¥ã®ã¢ãããŒãã䜿çšãããããæ¹ãå¹ççãªå ŽåããããŸãã
å®äžçã®äŸãšã°ããŒãã«ãªå¿çš
useCallbackã¯ãå°èŠæš¡ãªå人ãããžã§ã¯ãããå€§èŠæš¡ãªãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ãŸã§ãããããèŠæš¡ã®Reactã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšãããŠããŸãã以äžã«ãããã€ãã®å®äžçã®ã·ããªãªãšuseCallbackã®é©ç𿹿³ã瀺ããŸãïŒ
- Eã³ããŒã¹ãã©ãããã©ãŒã ïŒ Eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã
useCallbackã䜿çšããŠååãªã¹ãã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ãæé©åã§ããŸãããŠãŒã¶ãŒãååãªã¹ããæäœïŒäŸïŒãã£ã«ã¿ãªã³ã°ããœãŒãïŒãããšããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããããã«ãåã¬ã³ããªã³ã°ã¯å¹ççã§ããå¿ èŠããããŸããåã³ã³ããŒãã³ãã«æž¡ãããã€ãã³ããã³ãã©é¢æ°ïŒã«ãŒãã«ååã远å ãããªã©ïŒãã¡ã¢åããããšã§ããããã®ã³ã³ããŒãã³ããäžå¿ èŠã«åã¬ã³ããªã³ã°ãããªãããã«ããŸãã - ãœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ïŒ ãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ã¯ã倿°ã®ã³ã³ããŒãã³ããæã€è€éãªUIããã°ãã°æã£ãŠããŸãã
useCallbackã¯ããŠãŒã¶ãŒãã£ãŒããã³ã¡ã³ãã»ã¯ã·ã§ã³ããã®ä»ã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ã衚瀺ããã³ã³ããŒãã³ããæé©åã§ããŸããã³ã¡ã³ãã®ãªã¹ãã衚瀺ããã³ã³ããŒãã³ããæ³åããŠã¿ãŠãã ããã`likeComment`颿°ãã¡ã¢åããããšã§ããŠãŒã¶ãŒãã³ã¡ã³ãã«ããããïŒãããããã³ã«ã³ã¡ã³ããªã¹ãå šäœãåã¬ã³ããªã³ã°ãããã®ãé²ãããšãã§ããŸãã - ã€ã³ã¿ã©ã¯ãã£ããªããŒã¿å¯èŠåïŒ å€§èŠæš¡ãªããŒã¿ã»ãããšå¯èŠåã衚瀺ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ã
useCallbackã¯å¿çæ§ãç¶æããããã®éèŠãªããŒã«ãšãªãåŸãŸããå¯èŠåãšå¯Ÿè©±ããããã®ã€ãã³ããã³ãã©ïŒäŸïŒãºãŒã ããã³ãããŒã¿ãã€ã³ãã®éžæïŒã®ããã©ãŒãã³ã¹ãæé©åããããšã§ãã€ã³ã¿ã©ã¯ã·ã§ã³ã«ãã£ãŠçŽæ¥åœ±é¿ãåããªãã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãé²ããŸããäŸãã°ãéèããã·ã¥ããŒããç§åŠããŒã¿åæããŒã«ãªã©ã§ãã - åœéçãªã¢ããªã±ãŒã·ã§ã³ïŒããŒã«ã©ã€ãŒãŒã·ã§ã³ãšã°ããŒããªãŒãŒã·ã§ã³ïŒïŒ è€æ°ã®èšèªããµããŒãããã¢ããªã±ãŒã·ã§ã³ïŒäŸïŒç¿»èš³ã¢ããªãåœéçãªãŠãŒã¶ãŒããŒã¹ãæã€ãã©ãããã©ãŒã ïŒã§ã¯ã
useCallbackãããŒã«ã©ã€ãŒãŒã·ã§ã³ã©ã€ãã©ãªãšçµã¿åãããŠäœ¿çšããèšèªã倿Žããããšãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ãããšãã§ããŸãã翻蚳ãããæååãååŸããããæ¥ä»ãæ°å€ããã©ãŒããããããããé¢é£é¢æ°ãã¡ã¢åããããšã§ããã±ãŒã«ã倿Žããããšãã«åœ±é¿ãåããã³ã³ããŒãã³ãã®ã¿ãæŽæ°ãããããã«ããŸããç°ãªãé貚ã§å£åº§æ®é«ã衚瀺ããã°ããŒãã«ãªéè¡ã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŠãã ãããé貚ã倿Žãããå Žåãæ°ããéè²šã§æ®é«ã衚瀺ããã³ã³ããŒãã³ãã®ã¿ãåã¬ã³ããªã³ã°ããã¢ããªã±ãŒã·ã§ã³å šäœãåã¬ã³ããªã³ã°ãããã¯ãããŸããã - ãŠãŒã¶ãŒèªèšŒã»èªå¯ã·ã¹ãã ïŒ ãŠãŒã¶ãŒèªèšŒãæã€ã¢ããªã±ãŒã·ã§ã³ïŒã¢ã¡ãªã«ããã€ã³ããæ¥æ¬ãªã©ãããããåœã®ã¿ã€ãã«ããã£ãŠïŒïŒã¯ããŠãŒã¶ãŒã»ãã·ã§ã³ãšåœ¹å²ã管çããã³ã³ããŒãã³ããé »ç¹ã«äœ¿çšããŸãã
useCallbackã䜿çšããŠããã°ã€ã³ããã°ã¢ãŠãããŠãŒã¶ãŒæš©éã®æŽæ°ã«é¢é£ãã颿°ãã¡ã¢åããããšã§ãUIãå¹ççã«å¿çããããšãä¿èšŒããŸãããŠãŒã¶ãŒããã°ã€ã³ãããããã®åœ¹å²ã倿Žããããããå Žåã圱é¿ãåããã³ã³ããŒãã³ãã®ã¿ãåã¬ã³ããªã³ã°ãããå¿ èŠããããŸãã
çµè«ïŒå¹ççãªReactéçºã®ããã®useCallbackã®ç¿åŸ
useCallbackã¯ãã¢ããªã±ãŒã·ã§ã³ã®æé©åãç®æãReactéçºè
ã«ãšã£ãŠäžå¯æ¬ ãªããŒã«ã§ãããã®ç®çãå©ç¹ããããŠå¹æçãªäœ¿ç𿹿³ãçè§£ããããšã§ãã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžãããäžèŠãªåã¬ã³ããªã³ã°ãæžãããããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãçã¿åºãããšãã§ããŸããæŠç¥çã«äœ¿çšããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠããã«ããã¯ãç¹å®ããReact.memoãuseMemoã®ãããªä»ã®æé©åãã¯ããã¯ãšçµã¿åãããŠãå¹ççã§ä¿å®æ§ã®é«ãReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãå¿ããªãã§ãã ããã
ãã®ããã°èšäºã§æŠèª¬ããããã¹ããã©ã¯ãã£ã¹ãšäŸã«åŸãããšã§ãuseCallbackã®åãæŽ»çšããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®é«æ§èœãªReactã¢ããªã±ãŒã·ã§ã³ãäœæããããã®æºåãæŽãã§ãããã