useEffectEvent
useEffectEvent๋ Effect ๋ด๋ถ์ ๋น๋ฐ์ํ ๋ก์ง์ ์ถ์ถํด Effect ์ด๋ฒคํธ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ React Hook์
๋๋ค.
const onSomething = useEffectEvent(callback)๋ ํผ๋ฐ์ค
useEffectEvent(callback)
Effect ์ด๋ฒคํธ๋ฅผ ์ ์ธํ๊ธฐ ์ํด ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์์ useEffectEvent๋ฅผ ํธ์ถํ์ธ์. Effect ์ด๋ฒคํธ๋ useEffect์ ๊ฐ์ด Effect ๋ด๋ถ์์ ํธ์ถ ๊ฐ๋ฅํ ํจ์์
๋๋ค.
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: Effect ์ด๋ฒคํธ๋ฅผ ์ํ ๋ก์ง์ ํฌํจํ๋ ํจ์์ ๋๋ค.useEffectEvent๋ก Effect ์ด๋ฒคํธ๋ฅผ ์ ์ํ์ ๋,callback์ ์คํํ ๋๋ง๋ค ํญ์ ์ต์ ์ props์ state ๊ฐ์ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค๋๋ ํด๋ก์ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
๋ฐํ๊ฐ
Effect ์ด๋ฒคํธ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. useEffect, useLayoutEffect ๋๋ useInsertionEffect ๋ด๋ถ์์ ์ด ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์ฃผ์ ์ฌํญ
- Effect ๋ด๋ถ์์๋ง ํธ์ถํ์ธ์: Effect ์ด๋ฒคํธ๋ ์ค๋ก์ง Effect ๋ด๋ถ์์๋ง ํธ์ถํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ Effect ์ด์ ์ ๊ทธ๊ฒ์ ์ ์ํ์ธ์. ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ํ
์ผ๋ก ๊ทธ๊ฒ์ ์ ๋ฌํ์ง ๋ง์ธ์.
eslint-plugin-react-hooks๋ฆฐํฐ(๋ฒ์ 6.1.1 ๋๋ ์ต์ )๋ Effect ์ด๋ฒคํธ๋ฅผ ์๋ชป๋ ๋งฅ๋ฝ์์ ํธ์ถํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด ์ ํ์ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. - ์์กด์ฑ ์ง๋ฆ๊ธธ์ด ์๋๋๋ค: Effect์ ์์กด์ฑ ๋ฐฐ์ด์ ์์กด์ฑ์ ์ ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด
useEffectEvent๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. ์ด๊ฒ์ ๋ฒ๊ทธ๋ฅผ ์จ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ด๋ ต๊ฒ ํฉ๋๋ค. ๋ช ์์ ์ผ๋ก ์์กด์ฑ์ ์์ฑํ๊ฑฐ๋ ํ์ํ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ํด ref๋ฅผ ์ฌ์ฉํ์ธ์. - ๋น๋ฐ์ํ ๋ก์ง์ ์ํด ์ฌ์ฉํ์ธ์: ๋ณํ๋ ๊ฐ์ ์์กดํ์ง ์๋ ๋ก์ง์ ์ถ์ถํ๊ธฐ ์ํด์๋ง
useEffectEvent๋ฅผ ์ฌ์ฉํ์ธ์.
์ฌ์ฉ๋ฒ
์ต์ props์ state๋ฅผ ์ฝ๊ธฐ
์ ํ์ ์ผ๋ก, Effect ๋ด๋ถ์์ ๋ฐ์ํ ๊ฐ์ ์ฝ์ ๋, ์์กด์ฑ ๋ฐฐ์ด์ ๊ทธ๊ฒ์ ํฌํจํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ์ด ๋ฐ๋ ๋ ๋ง๋ค Effect๊ฐ ๋ค์ ๋์ํ๋๋ก ํ๊ณ , ์ด๊ฒ์ ๋ณดํต ๋ฐ๋์งํ ๋์์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ช๋ช์ ์ฌ๋ก์์, ์ด ๊ฐ๋ค์ด ๋ณํ ๋ Effect๊ฐ ๋ค์ ๋์ํ์ง ์๊ณ Effect ๋ด๋ถ์์ ๊ฐ์ฅ ์ต์ ์ props ๋๋ state๋ฅผ ์ฝ๊ณ ์ถ์ดํ ์ ์์ต๋๋ค.
Effect ๋ด๋ถ์์ ์ด ๊ฐ๋ค์ ๋ฐ์ํ์ผ๋ก ๋ง๋๋ ๊ฒ ์์ด ์ต์ props์ state๋ฅผ ์ฝ๊ธฐ ์ํด Effect ์ด๋ฒคํธ ๋ด๋ถ์ ๊ทธ๊ฒ๋ค์ ํฌํจํ์ธ์.
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์ด ๋ฐ๋ ๋(์๋ก์ด ํ์ด์ง ๋ฐฉ๋ฌธ์ ๋ก๊น
ํ๊ธฐ ์ํด) Effect๋ ๋๋ ์ดํ์ ๋ค์ ๋์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ numberOfItems๊ฐ ๋ฐ๋ ๋ ๋ค์ ๋์ํ๋ฉด ์๋ฉ๋๋ค. ๋ก๊น
๋ก์ง์ Effect ์ด๋ฒคํธ๋ก ๊ฐ์ธ numberOfItems๋ ๋น๋ฐ์ํ์ด ๋ฉ๋๋ค. ์ด๊ฒ์ ํญ์ Effect๋ฅผ ํธ๋ฆฌ๊ฑฐ ํ๋ ๊ฒ ์์ด ์ต์ ์ ๊ฐ์ ์ฝ์ต๋๋ค.
url๊ณผ ๊ฐ์ ๋ฐ์ํ ๊ฐ์ Effect ์ด๋ฒคํธ์ ์ธ์๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด๋ก์จ, ์ด๋ฒคํธ ๋ด๋ถ์ ๋น๋ฐ์ํ ๊ฐ์ ์ ๊ทผํ ๋ ์ด๊ฒ๋ค์ ๋ฐ์ํ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค.