React์ experimental_useEvent ํ ์ ์ดํด๋ณด์ธ์. ๊ธ๋ก๋ฒ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ๊ณผ ์ฝ๋ ๋ช ํ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
React์ experimental_useEvent ์ดํดํ๊ธฐ: ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋
์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ๋๋ฆฌ ์ฑํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ๊ฐ๋ฐ์์๊ฒ ์ ํ๋ฆฌ์ผ์ด์
์ํ ๋ฐ ์ํธ ์์ฉ์ ๊ด๋ฆฌํ๋ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ฐ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ ์ํด ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ํ์ฌ ์คํ ๋จ๊ณ์ ์๋ ๊ฐ์ฅ ์ต๊ทผ ์ถ๊ฐ ๊ธฐ๋ฅ ์ค ํ๋๋ experimental_useEvent
ํ
์
๋๋ค. ์ด ๊ฐ์ด๋๋ ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ, ์ด์ ๋ฐ ๊ธ๋ก๋ฒ React ์ ํ๋ฆฌ์ผ์ด์
์์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ ๋ฌธ์ ์ดํด: ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐ ์ฌ ๋ ๋๋ง
experimental_useEvent
์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. React์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์ ์ ์๋ฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ ๋๋ง๋ค ์ด๋ฌํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ค์ ์์ฑ๋ฉ๋๋ค. ํนํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ณต์กํ ์์
์ ์ํํ๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌ๋ ๋ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฒํผ๊ณผ ์
๋ ฅ ํ๋๊ฐ ์๋ ์ปดํฌ๋ํธ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ญ์์ค. ์
๋ ฅ ํ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ๋ฒํผ์ onClick
ํธ๋ค๋ฌ๊ฐ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ์ ์๋๋ฉด ๋ชจ๋ ์ฌ ๋ ๋๋ง ์ ๋ค์ ์์ฑ๋ฉ๋๋ค. ๊ฐ๋จํ ํธ๋ค๋ฌ์ ๊ฒฝ์ฐ ํฐ ๋ฌธ์ ๋ ์๋์ง๋ง ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์
์ด๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
experimental_useEvent
์๊ฐ
experimental_useEvent
ํ
์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ฌ ๋ ๋๋ง์์ ๋ณ๊ฒฝ๋์ง ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฉ๋ชจํํ๋๋ก ์ค๊ณ๋์ด ์ฌ๋ฌ ๋ ๋๋ง์์ ๋์ผํ ํจ์ ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋๋๋ก ํฉ๋๋ค. ์ด๋ก ์ธํด ์ฑ๋ฅ์ด ํฅ์๋๊ณ ํธ๋ค๋ฌ๋ฅผ props๋ก ๋ฐ๋ ์์ ์ปดํฌ๋ํธ์์ ์ฌ ๋ ๋๋ง์ด ์ค์ด๋ค ์ ์์ต๋๋ค.
์ฃผ์ ์ด์ :
- ์ฑ๋ฅ ์ต์ ํ: ๋ถํ์ํ ํจ์ ์ฌ์์ฑ์ ์ค์ฌ ๋ ๋๋ง ์๊ฐ์ ๋จ์ถํฉ๋๋ค.
- ์ฐธ์กฐ ์์ ์ฑ: ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ฌ ๋ ๋๋ง ์์๋ ID๋ฅผ ์ ์งํ์ฌ prop ๋น๊ต๋ฅผ ๋จ์ํํ๊ณ ๋ถํ์ํ ์์ ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ฝ๋ ๋ช ํ์ฑ: ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ ๋๋ง ๋ก์ง๊ณผ ๋ถ๋ฆฌํ์ฌ ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๋ฐ ๊ตฌ๋ฌธ
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
์ปดํฌ๋ํธ์ ๋ถํ์ํ ์ฌ ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ์ญ์ ์์
์ด ํธ๋ฆฌ๊ฑฐ๋ ๋ ๊ด๋ จ ๋ชฉ๋ก ํญ๋ชฉ๋ง ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ ๋๊ท๋ชจ ํญ๋ชฉ ๋ชฉ๋ก์ ํนํ ์ ์ฉํฉ๋๋ค. ์์ฒ ๊ฐ์ ์ ํ์ด ์๋ ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณ ๋ คํด ๋ณด์ญ์์ค. ์ด ์ต์ ํ๋ฅผ ํตํด ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค.
์์ 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`๊ณผ ํจ๊ป ์ฌ์ฉ(์ ํ ์ฌํญ์ด์ง๋ง ์ข
์ข
์ ์ฉํจ): ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ํนํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ์ ๋ฌํ ๋
experimental_useEvent
๋ฅผuseCallback
๊ณผ ๊ฒฐํฉํ๋ฉด ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ฑ๋ฅ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.useCallback
์experimental_useEvent
ํ ์ ๋ฉ๋ชจํํ์ฌ ์ฌ ๋ ๋๋ง ์ ๋ค์ ์์ฑ๋์ง ์๋๋ก ํ์ฌ ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํํฉ๋๋ค. - ๊ณผ๋ํ ์ฌ์ฉ: ๊ณผ๋ํ๊ฒ ์ต์ ํํ์ง ๋ง์ญ์์ค.
experimental_useEvent
๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ์ญ์์ค. ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. ๊ฐ๋จํ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ฒฝ์ฐ ์ฑ๋ฅ ํฅ์์ด ๋ฏธ๋ฏธํ ์ ์์ต๋๋ค. - ํธํ์ฑ: ์ด๋ ์คํ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค. React ๋ฒ์ ์ด
experimental_useEvent
๋ฅผ ์ง์ํ๋์ง ํ์ธํ์ญ์์ค. ํธํ์ฑ ์ธ๋ถ ์ ๋ณด๋ ๊ณต์ React ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. - ํ ์คํธ: ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค. ๋๋ฐ์ด์ฑ ๋๋ ์ค๋กํ๋ง๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ ๋ ํ ์คํธ๊ฐ ํนํ ์ค์ํด์ง๋๋ค.
- ๊ธ๋ก๋ฒ ์ํ ๊ด๋ฆฌ: Redux ๋๋ Zustand์ ๊ฐ์ ๊ธ๋ก๋ฒ ์ํ ๊ด๋ฆฌ ์๋ฃจ์
์ ๋ค๋ฃฐ ๋
experimental_useEvent
๊ฐ ๋ถ์์ฉ์ ํธ๋ฆฌ๊ฑฐํ๊ฑฐ๋ ๊ธ๋ก๋ฒ ์ ์ฅ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ์์ ์ ์ ์ฉํ ์ ์๋์ง ๊ณ ๋ คํ์ญ์์ค. - ์ค๋ฅ ์ฒ๋ฆฌ: ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด, ํ๋์จ์ด ๊ตฌ์ฑ ๋๋ ์ฌ์ฉ์ ์์ ์ผ๋ก ์ธํด ์๊ธฐ์น ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ํนํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ฌ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ ์ ํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ธฐ์
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. ์ด๋ฒคํธ ์์ ๋ฐ Prop ๋๋ฆด๋ง
๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ด๋ฒคํธ ์์(์์ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ๋ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ)์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. experimental_useEvent
๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ณ์ธต(prop ๋๋ฆด๋ง)์ ํตํด prop์ผ๋ก ์ ๋ฌ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ค์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค.
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 ๊ฐ๋ฐ์ ๋ฏธ๋๋ฅผ ์ฟ๋ณผ ์ ์์ผ๋ฉฐ ๊ฐ๋ฐ์์๊ฒ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์๋ ์๋ก์ด ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ์คํ๊ฒ ์ฌ์ฉํ๋ฉด ์ด ํ
์ ๋ค์ํ ์ง๋ฆฌ์ ์์น์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์
์๋ต์ฑ์ ๊ฐ์ ํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ ์ฆ๊ฒ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.