useEffectEvent
useEffectEvent ã¯ãã¨ãã§ã¯ãããéãĒãĸã¯ããŖããĒãã¸ãã¯ããã¨ãã§ã¯ãã¤ããŗã (Effect Event) ã¨åŧã°ããååŠį¨å¯čŊãĒéĸæ°ã¸ã¨æŊåēã§ãããããĢãã React ããã¯ã§ãã
const onSomething = useEffectEvent(callback)ãĒããĄãŦãŗãš
useEffectEvent(callback)
ãŗãŗããŧããŗããŽããããŦããĢã§ useEffectEvent ãåŧãŗåēããã¨ãã§ã¯ãã¤ããŗããåŽŖč¨ããžããã¨ãã§ã¯ãã¤ããŗãã¯ãuseEffect ãĒãŠãŽã¨ãã§ã¯ãå
ããåŧãŗåēããã¨ãã§ããéĸæ°ã§ãã
import { useEffectEvent, useEffect } from 'react';
function ChatRoom({ roomId, theme }) {
const onConnected = useEffectEvent(() => {
showNotification('Connected!', theme);
});
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.on('connected', () => {
onConnected();
});
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...
}åŧæ°
callback: ã¨ãã§ã¯ãã¤ããŗããŽãã¸ãã¯ãåĢãéĸæ°ãuseEffectEventã§ã¨ãã§ã¯ãã¤ããŗããåŽįžŠããã¨ãcallbackã¯å¸¸ãĢãåŧãŗåēãããįŦé㎠props ã state ãŽææ°ãŽå¤ãĢãĸã¯ãģãšããžãããããĢãããå¤ããĒãŖãã¯ããŧã¸ãŖãĢéĸããåéĄãåéŋã§ããžãã
čŋãå¤
ã¨ãã§ã¯ãã¤ããŗãéĸæ°ãčŋããžããããŽéĸæ°ã¯ useEffectãuseLayoutEffectãããã㯠useInsertionEffect å
ã§åŧãŗåēããã¨ãã§ããžãã
æŗ¨æįš
- ã¨ãã§ã¯ãå
ã§ãŽãŋåŧãŗåēãīŧã¨ãã§ã¯ãã¤ããŗãã¯ã¨ãã§ã¯ãå
ãããŽãŋåŧãŗåēããšãã§ãããããäŊŋį¨ããã¨ãã§ã¯ããŽį´åã§åŽįžŠãããããĢããĻãã ãããäģãŽãŗãŗããŧããŗããããã¯ãĢæ¸ĄããĒãã§ãã ããã
eslint-plugin-react-hooksãĒãŗãŋīŧããŧã¸ã§ãŗ 6.1.1 äģĨéīŧã¯ããŽåļį´ãåŧˇåļãããã¨ã§ãčǤãŖãäŊŋãæšã§ãŽã¨ãã§ã¯ãã¤ããŗããŽåŧãŗåēãã鞿ĸããžãã - äžåé
åãéŋãããããŽããŽã§ã¯ãĒãīŧã¨ãã§ã¯ããŽäžåé
åã§äžåå¤ãæåŽãããã¨čĒäŊãéŋãããããĢ
useEffectEventãäŊŋį¨ããĻã¯ãããžããããã°ãé čŊããããŗãŧããįč§ŖããĢãããĒããžããæį¤ēįãĢäžåå¤ãæ¸ãããåŋ čĻãĢåŋããĻ ref ãäŊŋį¨ããĻäģĨåãŽå¤ã¨æ¯čŧãããããĢããĻãã ããã - éãĒãĸã¯ããŖããĒãã¸ãã¯ã ããĢäŊŋãīŧ
useEffectEventã¯ãå¤ãŽå¤åãĢäžåããĒããã¸ãã¯ãæŊåēããįŽįãĢãŽãŋäŊŋį¨ããĻãã ããã
äŊŋ፿ŗ
ææ°ãŽ props 㨠state ãčĒãŋåã
é常ãã¨ãã§ã¯ãå ã§ãĒãĸã¯ããŖããĒå¤ãĢãĸã¯ãģãšããå ´åã¯ããããäžåé åãĢåĢããåŋ čĻããããžãããããĢãããããŽå¤ãå¤åããããŗãĢã¨ãã§ã¯ããååŽčĄãããžããé常ã¯ãããæãžããåäŊã§ãã
ãããå ´åãĢããŖãĻã¯ãããããŽå¤ãå¤åããĻãã¨ãã§ã¯ããååŽčĄããããã¨ãĒããã¨ãã§ã¯ãå ã§ææ°ãŽ props ã state ãčĒãŋåããããã¨ããããžãã
ã¨ãã§ã¯ãå ã§ææ°ãŽ props ã state ãčĒãŋåãéãĢãããããŽå¤ããĒãĸã¯ããŖããĢããĒããããĢãããĢã¯ãã¨ãã§ã¯ãã¤ããŗãå ãĢåĢããžãã
import { useEffect, useContext, useEffectEvent } from 'react';
function Page({ url }) {
const { items } = useContext(ShoppingCartContext);
const numberOfItems = items.length;
const onNavigate = useEffectEvent((visitedUrl) => {
logVisit(visitedUrl, numberOfItems);
});
useEffect(() => {
onNavigate(url);
}, [url]);
// ...
}ããŽäžã§ã¯ãurl ãå¤åãããã¨ãŽåãŦãŗããŧã§ã¯ã¨ãã§ã¯ããååŽčĄããããšãã§ããīŧæ°ããããŧã¸ãŽč¨Ēåãč¨é˛ããããīŧãnumberOfItems ãå¤åããå ´åãĢã¯ååŽčĄããããšãã§ã¯ãããžããããã°č¨é˛ãŽãã¸ãã¯ãã¨ãã§ã¯ãã¤ããŗãã§ãŠãããããã¨ã§ãnumberOfItems ã¯ãĒãĸã¯ããŖãã§ã¯ãĒããĒããžããã¨ãã§ã¯ããããĒãŦãããã¨ãĒãã常ãĢææ°ãŽå¤ãčĒãŋåãããžãã
url ãŽãããĒãĒãĸã¯ããŖããĒå¤ã¯ãã¨ãã§ã¯ãã¤ããŗããĢåŧæ°ã¨ããĻæ¸Ąããã¨ã§ããããããĒãĸã¯ããŖããĢäŋãĄãĒãããã¤ããŗãå
ã§ææ°ãŽéãĒãĸã¯ããŖããĒå¤ãĢããĸã¯ãģãšãããã¨ãã§ããžãã