Reactã®experimental_useEventããã¯ã解説ïŒã°ããŒãã«ãªReactã¢ããªã±ãŒã·ã§ã³ã§ããã©ãŒãã³ã¹ãšã³ãŒãã®æçããåäžãããããã®ã€ãã³ãåŠçã®æé©åæ¹æ³ãåŠã³ãŸãã
Reactã®experimental_useEventã培åºè§£èª¬ïŒã°ããŒãã«éçºè åãç·åã¬ã€ã
Reactã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®åºãæ®åããŠããJavaScriptã©ã€ãã©ãªã§ãããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãšã€ã³ã¿ã©ã¯ã·ã§ã³ãããå¹ççãã€ãšã¬ã¬ã³ãã«ç®¡çããæ¹æ³ãéçºè
ã«æäŸããããã«åžžã«é²åããŠããŸããæãæ°ããè¿œå æ©èœã®1ã€ã§ãçŸåšå®é𿮵éã«ããã®ããexperimental_useEvent
ããã¯ã§ãããã®ã¬ã€ãã§ã¯ããã®åŒ·åãªæ©èœããã®å©ç¹ãããã³ã°ããŒãã«ãªReactã¢ããªã±ãŒã·ã§ã³ã§å¹æçã«æŽ»çšããæ¹æ³ã«ã€ããŠå
æ¬çã«çè§£ã§ããŸãã
ã³ã¢ãªåé¡ã®çè§£ïŒã€ãã³ããã³ãã©ãŒãšåã¬ã³ããªã³ã°
experimental_useEvent
ã«ã€ããŠæãäžããåã«ãããã察åŠããåé¡ãçè§£ããããšãéèŠã§ããReactã§ã¯ãã€ãã³ããã³ãã©ãŒã¯éåžžã颿°ã³ã³ããŒãã³ãå
ã§å®çŸ©ãããŸããã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããããã³ã«ããããã®ã€ãã³ããã³ãã©ãŒãåäœæãããŸããããã«ãããç¹ã«ã€ãã³ããã³ãã©ãŒãè€éãªæäœãå®è¡ããããåã³ã³ããŒãã³ãã«propsãšããŠæž¡ããããããå Žåã«ãããã©ãŒãã³ã¹ã®åé¡ãçºçããå¯èœæ§ããããŸãã
ã³ã³ããŒãã³ãã«ãã¿ã³ãšå
¥åãã£ãŒã«ããããã·ããªãªãèããŠã¿ãŸããããå
¥åãã£ãŒã«ãã倿Žããããšãã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããŸãããã¿ã³ã®onClick
ãã³ãã©ãŒãã³ã³ããŒãã³ãå
ã§çŽæ¥å®çŸ©ãããŠããå Žåãåã¬ã³ããªã³ã°ããšã«åäœæãããŸããããã¯åçŽãªãã³ãã©ãŒã§ã¯å€§ããªåé¡ã§ã¯ãªããããããŸããããèšç®è² è·ã®é«ãã¿ã¹ã¯ãå€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã«ã¯ããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
experimental_useEvent
ã®ç޹ä»
experimental_useEvent
ããã¯ã䜿çšãããšãåã¬ã³ããªã³ã°ããšã«å€åããªãã€ãã³ããã³ãã©ãŒãå®çŸ©ã§ããŸããããã¯ã€ãã³ããã³ãã©ãŒãã¡ã¢åããããã«èšèšãããŠãããè€æ°ã®ã¬ã³ããªã³ã°ã§åã颿°ã€ã³ã¹ã¿ã³ã¹ã䜿çšãããããã«ããŸããããã«ãããããã©ãŒãã³ã¹ãåäžãããã³ãã©ãŒãpropsãšããŠåä¿¡ããåã³ã³ããŒãã³ãã§ã®åã¬ã³ããªã³ã°ã®å¯èœæ§ãå°ãªããªããŸãã
äž»ãªå©ç¹ïŒ
- ããã©ãŒãã³ã¹ã®æé©åïŒäžèŠãªé¢æ°ã®åäœæãæžãããã¬ã³ããªã³ã°æéãççž®ããŸãã
- åç §ã®å®å®æ§ïŒã€ãã³ããã³ãã©ãŒã¯åã¬ã³ããªã³ã°éã§IDãç¶æããpropsã®æ¯èŒãç°¡çŽ åããäžèŠãªåã³ã³ããŒãã³ãã®æŽæ°ãé²ããŸãã
- ã³ãŒãã®æçãïŒã€ãã³ããã³ãã©ãŒã®ããžãã¯ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããžãã¯ããåé¢ããããšã«ãããã³ãŒããããã¯ãªãŒã³ã§çè§£ããããããŸãã
åºæ¬çãªäœ¿çšæ³ãšæ§æ
experimental_useEvent
ã䜿çšããããã®æ§æã¯ç°¡åã§ãã'react'ããã€ã³ããŒãããã³ã³ããŒãã³ãå
ã§ã€ãã³ããã³ãã©ãŒãå®çŸ©ããããã«äœ¿çšããŸãã
import { experimental_useEvent } from 'react';
function MyComponent() {
const handleClick = experimental_useEvent(() => {
console.log('Button clicked!');
});
return (
<button onClick={handleClick}>Click me</button>
);
}
ãã®äŸã§ã¯ãhandleClick
ã¯experimental_useEvent
ã«ãã£ãŠã¡ã¢åãããŸããã³ã³ããŒãã³ãã®ä»ã®ç¶æ
倿°ãå€åããŠããåã¬ã³ããªã³ã°éã§åã颿°ã€ã³ã¹ã¿ã³ã¹ã®ãŸãŸã§ãã
å®è·µçãªäŸãšã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ã·ããªãª
äŸ1ïŒã¯ãªãã¯ãã³ãã©ãŒã®æé©å
ã³ã³ããŒãã³ããã¢ã€ãã ã®ãªã¹ãã衚瀺ããåã¢ã€ãã ã«ã¯ãã¯ãªãã¯ãããšå逿äœãããªã¬ãŒãããã¿ã³ãããã·ããªãªãèããŠã¿ãŸããããexperimental_useEvent
ããªãå Žåãåãã¿ã³ã®onClick
ãã³ãã©ãŒã¯ãªã¹ãã¢ã€ãã ã®ã¬ã³ããªã³ã°ããšã«åäœæãããŸããexperimental_useEvent
ã䜿çšãããšããããæé©åã§ããŸãã
import { experimental_useEvent, useState } from 'react';
function ItemList({ items, onDeleteItem }) {
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name} <button onClick={() => onDeleteItem(item.id)}>Delete</button>
</li>
))}
</ul>
);
}
function ParentComponent() {
const [items, setItems] = useState([
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
]);
const onDeleteItem = experimental_useEvent((itemId) => {
setItems(prevItems => prevItems.filter(item => item.id !== itemId));
});
return (
<div>
<ItemList items={items} onDeleteItem={onDeleteItem} />
</div>
);
}
ãã®äŸã§ã¯ãonDeleteItem
ãã¡ã¢åãããŸããããã«ãããItemList
ã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ã鲿¢ãããå逿äœãããªã¬ãŒããããšãã«ãé¢é£ãããªã¹ãã¢ã€ãã ã®ã¿ãæŽæ°ãããããã«ãªããŸããããã¯ãå€§èŠæš¡ãªã¢ã€ãã ãªã¹ãã«ç¹ã«åœ¹ç«ã¡ãŸããæ°åã®è£œåãããã°ããŒãã«eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŠãã ããããã®æé©åã«ãããããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã
äŸ2ïŒã€ãã³ããã³ãã©ãŒã®ãããŠã³ã¹ïŒã°ããŒãã«æ€çŽ¢çšïŒ
ãŠãŒã¶ãŒãæ€çŽ¢ã¯ãšãªãå
¥åã§ããã°ããŒãã«æ€çŽ¢æ©èœãæ³åããŠãã ããããŠãŒã¶ãŒã®å
¥åæã«ãµãŒããŒã«ãªã¯ãšã¹ããæ®ºå°ããã®ãé²ãããã«ããããŠã³ã¹ãäžå¯æ¬ ã§ããexperimental_useEvent
ã䜿çšããŠããã®ããã»ã¹ãæé©åã§ããŸãã
import { experimental_useEvent, useState, useCallback } from 'react';
function SearchBar() {
const [searchTerm, setSearchTerm] = useState('');
const debouncedSearch = useCallback(experimental_useEvent((query) => {
// Simulate API call with a delay
setTimeout(() => {
console.log(`Searching for: ${query}`);
// Replace with actual API call using fetch or axios
}, 300); // Debounce delay (300ms)
}), []);
const handleChange = (event) => {
const query = event.target.value;
setSearchTerm(query);
debouncedSearch(query);
};
return (
<input type="text" value={searchTerm} onChange={handleChange} placeholder="Search..." />
);
}
ãã®äŸã§ã¯ãdebouncedSearch
ãã¡ã¢åãããŠãããæ€çŽ¢é¢æ°ãäžå¿
èŠã«åäœæãããªãããã«ãªã£ãŠããŸããuseCallback
ã¯ãexperimental_useEvent
ããã¯èªäœãåã¬ã³ããªã³ã°ã§åäœæãããªãããã«ããŸãããããŠã³ã¹ã«ãããæ€çŽ¢ãªã¯ãšã¹ãã¯å
¥åãäžæåæ¢ããåŸã«ã®ã¿éä¿¡ãããããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããµãŒããŒã®è² è·ã軜æžãããŸãããã®ã¢ãããŒãã¯ããããã¯ãŒã¯é
å»¶ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ã®ãããããŸããŸãªå°ççå Žæã«ãããŠãŒã¶ãŒãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéåžžã«éèŠã§ãã
äŸ3ïŒãã©ãŒã éä¿¡ã®åŠçïŒåœéãã©ãŒã çšïŒ
åœéçãªç»é²ãã©ãŒã ãèããŠã¿ãŸããããonSubmit
ãã³ãã©ãŒã«experimental_useEvent
ã䜿çšãããšããã©ãŒã ã®ãã£ãŒã«ããå€ãå Žåããè€éãªæ€èšŒãå®è¡ãããå Žåã«ãããã©ãŒãã³ã¹ã®åé¡ãé²ãããšãã§ããŸããããã¯ãã¢ãã¬ã¹ãé»è©±çªå·ãé貚圢åŒãªã©ãå€ãã®åœéçãªãã£ãŒã«ããé¢äžããã°ããŒãã«ããžãã¹ã«ãšã£ãŠç¹ã«éèŠã§ãããå€ãã®å Žåãè€éãªæ€èšŒã«ãŒã«ããããŸãã
import { experimental_useEvent, useState } from 'react';
function RegistrationForm() {
const [formData, setFormData] = useState({ email: '', password: '' });
const handleSubmit = experimental_useEvent((event) => {
event.preventDefault();
// Perform form validation and submission logic here.
console.log('Form submitted with:', formData);
});
const handleChange = (event) => {
const { name, value } = event.target;
setFormData(prevData => ({ ...prevData, [name]: value }));
};
return (
<form onSubmit={handleSubmit}>
<label htmlFor="email">Email:</label>
<input type="email" id="email" name="email" value={formData.email} onChange={handleChange} />
<label htmlFor="password">Password:</label>
<input type="password" id="password" name="password" value={formData.password} onChange={handleChange} />
<button type="submit">Register</button>
</form>
);
}
handleSubmit
颿°ãã¡ã¢åããããšã«ããããã©ãŒã éä¿¡ããžãã¯ãæé©åãããç¹ã«æ€èšŒããã»ã¹ãŸãã¯ãããã¯ãŒã¯ãªã¯ãšã¹ãã«æéããããå Žåã«ãå¿çæ§ãåäžããŸãããã®å©ç¹ã¯ãããŸããŸãªã°ããŒãã«ã¹ã¿ã³ããŒãã«å¯Ÿå¿ããããã«ãã©ãŒã ãã£ãŒã«ãã«è€éãªæ€èšŒã«ãŒã«ãé »ç¹ã«å«ãŸããåœéçãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã«å€§ãããªããŸãã
ãã¹ããã©ã¯ãã£ã¹ãšèæ ®äºé
- `useCallback`ãšã®äœµçšïŒãªãã·ã§ã³ã§ãããå€ãã®å Žå圹ç«ã¡ãŸãïŒïŒå€ãã®å Žåãç¹ã«ã€ãã³ããã³ãã©ãŒãåã³ã³ããŒãã³ãã«propsãšããŠæž¡ãå Žåã¯ã
experimental_useEvent
ãuseCallback
ãšçµã¿åãããããšã§ãæãå ç¢ãªããã©ãŒãã³ã¹äžã®å©ç¹ãåŸãããŸããuseCallback
ã¯experimental_useEvent
ããã¯ãã¡ã¢åããåã¬ã³ããªã³ã°ã§åäœæãããªãããã«ããããšã§ãããã©ãŒãã³ã¹ãããã«æé©åããŸãã - 䜿ãããïŒéåºŠã«æé©åããªãã§ãã ããã
experimental_useEvent
ã¯æ éã«äœ¿çšããŠãã ãããèšç®ã³ã¹ããé«ãã€ãã³ããã³ãã©ãŒããåã³ã³ããŒãã³ãã«propsãšããŠæž¡ãããã€ãã³ããã³ãã©ãŒã«æé©ã§ããåçŽãªã€ãã³ããã³ãã©ãŒã®å Žåãããã©ãŒãã³ã¹ã®åäžã¯ããããããããããŸããã - äºææ§ïŒããã¯å®éšçãªæ©èœã§ããReactã®ããŒãžã§ã³ã
experimental_useEvent
ããµããŒãããŠããããšã確èªããŠãã ãããäºææ§ã®è©³çްã«ã€ããŠã¯ãå ¬åŒã®Reactããã¥ã¡ã³ããåç §ããŠãã ããã - ãã¹ãïŒã€ãã³ããã³ãã©ãŒãæåŸ ã©ããã«åäœããããšã確èªããããã«ãå æ¬çãªãã¹ããäœæããŸãããããŠã³ã¹ãã¹ããããªã³ã°ãªã©ã®ææ³ã䜿çšããå Žåã¯ããã¹ããç¹ã«éèŠã«ãªããŸãã
- ã°ããŒãã«ç¶æ
管çïŒReduxãZustandãªã©ã®ã°ããŒãã«ç¶æ
管çãœãªã¥ãŒã·ã§ã³ãæ±ãå Žåã¯ãå¯äœçšãã°ããŒãã«ã¹ãã¢ã®æŽæ°ãããªã¬ãŒããã¢ã¯ã·ã§ã³ã«
experimental_useEvent
ã圹ç«ã€ãã©ãããæ€èšããŠãã ããã - ãšã©ãŒåŠçïŒç¹ã«ãããŸããŸãªãããã¯ãŒã¯ç¶æ³ãããŒããŠã§ã¢æ§æããŸãã¯ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãåå ã§äºæããªããšã©ãŒãçºçããå¯èœæ§ãããäžçäžã§äœ¿çšãããŠããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæœåšçãªåé¡ãé©åã«ç®¡çããããã«ãã€ãã³ããã³ãã©ãŒå ã§å ç¢ãªãšã©ãŒåŠçãå®è£ ããŸãã
é«åºŠãªãŠãŒã¹ã±ãŒã¹ãšãã¯ããã¯
1. ã€ãã³ãã®ã¹ããããªã³ã°
ã€ãã³ãã®ã¹ããããªã³ã°ã¯ãã€ãã³ãã®é »åºŠã管çãããã1ã€ã®ææ³ã§ãããç¹å®ã®æéå
ã«å®è¡ããã颿°ã®åæ°ãå¶éããããã«ãã䜿çšãããŸããããã¯ã`scroll`ã`resize`ã€ãã³ããªã©ãé »ç¹ã«ããªã¬ãŒãããã€ãã³ãã«ç¹ã«åœ¹ç«ã¡ãŸããexperimental_useEvent
ã䜿çšãããšãã€ãã³ããã³ãã©ãŒããããŠã³ã¹ãŸãã¯ã¹ããããªã³ã°ããŠãããã©ãŒãã³ã¹ãæé©åã§ããŸãã
import { experimental_useEvent } from 'react';
import { throttle } from 'lodash'; // Install with: npm install lodash
function ResizeComponent() {
const handleResize = experimental_useEvent(throttle(() => {
console.log('Window resized');
}, 250)); // Throttle every 250ms
useEffect(() => {
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, [handleResize]);
return <div>Resize the window</div>;
}
ãã®äŸã§ã¯ãLodashã©ã€ãã©ãªã®throttle
颿°ã䜿çšããŠãhandleResize
åŒã³åºãã®é »åºŠãå¶éããŠããŸããnpm install lodash
ãŸãã¯yarn add lodash
ã§lodashã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿
èŠãããå Žåãããããšã«æ³šæããŠãã ãã
2. ã€ãã³ãå§è²ãšããããããªãªã³ã°
å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã€ãã³ãå§è²ïŒèŠªã³ã³ããŒãã³ããåã³ã³ããŒãã³ãã®ã€ãã³ããåŠçããå ŽæïŒã«ãããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããexperimental_useEvent
ã¯ãè€æ°ã®ã³ã³ããŒãã³ãã®ã¬ã€ã€ãŒïŒããããããªãªã³ã°ïŒãéããŠpropsãšããŠæž¡ãããã€ãã³ããã³ãã©ãŒãåäœæããªãããã«ããããã®ã·ããªãªã«æé©ã§ãã
experimental_useEvent
ã䜿çšããŠæäžäœã¬ãã«ã§ã€ãã³ããã³ãã©ãŒãã¡ã¢åããããšã«ããããã³ãã©ãŒã®IDãã³ã³ããŒãã³ãããªãŒå
šäœã§å®å®ããç¶æ
ãç¶æããäžéã³ã³ããŒãã³ããšåã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ã倧å¹
ã«åæžã§ããŸãã
3. ã€ãã³ãåŠççšã®ã«ã¹ã¿ã ããã¯
ã«ã¹ã¿ã ããã¯ãäœæããŠãã€ãã³ãåŠçããžãã¯ãã«ãã»ã«åã§ããŸããããã«ãããã³ãŒããããã¯ãªãŒã³ã«ããåå©çšããããããã¹ãããããããããšãã§ããŸããã«ã¹ã¿ã ããã¯ã¯ãã€ãã³ããªã¹ããŒã®è¿œå ãšåé€ãåŠçããããã©ãŒãã³ã¹åäžã®ããã«experimental_useEvent
ãå«ããããšãã§ããŸãã
import { experimental_useEvent, useEffect } from 'react';
function useWindowResize(callback) {
const handleResize = experimental_useEvent(callback);
useEffect(() => {
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, [handleResize]);
return handleResize;
}
function ExampleComponent() {
const onWindowResize = useWindowResize(() => {
console.log('Window resized in ExampleComponent');
});
return <div>Resize the window</div>;
}
ãã®ã«ã¹ã¿ã ããã¯useWindowResize
ã¯ãããã¯ãªãŒã³ãªçµ±åã®ããã«ã€ãã³ããªã¹ããŒãšexperimental_useEvent
ãã©ããããŸãã
experimental_useEvent
ãšReactã®å°æ¥
Reactãé²åãç¶ããã«ã€ããŠãexperimental_useEvent
ã®ãããªæ©èœã¯ãããã©ãŒãã³ã¹ã®æé©åãšéçºè
ã®ãšã¯ã¹ããªãšã³ã¹ã®åäžã«éç¹ã眮ããŠããããšã瀺ããŠããŸãããŸã å®é𿮵éã«ãããŸãããããã©ãŒãã³ã¹äžã®å©ç¹ãšãããåçåãããã³ãŒããäœæã§ããå¯èœæ§ã«ãããReactãšã³ã·ã¹ãã ãžã®ææãªè¿œå ãšãªããŸãã
éçºè
ã¯ãå
¬åŒã®Reactããã¥ã¡ã³ããšã³ãã¥ããã£ãªãœãŒã¹ã宿çã«åç
§ããŠããã®ããã¯ã®é²åã«ã€ããŠåžžã«æ
å ±ãåŸãå¿
èŠããããŸããexperimental_useEvent
ã®ãããªæ©èœã®è€éããçè§£ããããšã§ãéçºè
ã¯ã°ããŒãã«ãªãŒãã£ãšã³ã¹åãã«ããã髿§èœã§ä¿å®å¯èœã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
çµè«
experimental_useEvent
ããã¯ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã§ã®ã€ãã³ãåŠçãæé©åããããã®åŒ·åãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããã€ãã³ããã³ãã©ãŒãã¡ã¢åããããšã§ãããã©ãŒãã³ã¹ãåäžãããäžèŠãªåã¬ã³ããªã³ã°ãæžãããããã¯ãªãŒã³ã§ä¿å®ããããã³ãŒããäœæã§ããŸããããã¯å®éšçãªæ©èœã§ãããReactéçºã®æªæ¥ãå£éèŠãããšãã§ããéçºè
ã«äžçäžã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸã§ãã髿§èœã§å¹ççãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æ°ããããŒã«ãæäŸããŸããæ
éã«äœ¿çšãããšããã®ããã¯ã¯ããŸããŸãªå°ççå Žæã§ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã倧å¹
ã«åäžãããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžãããã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«ãšã£ãŠã¢ããªã±ãŒã·ã§ã³ãããæ¥œãããã®ã«ããããšãã§ããŸãã