useEffect
Side-Effect๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ Hook์ ๋๋ค.
Side-Effect : ํจ์๊ฐ ์คํ๋๋ฉด์ ํจ์ ์ธ๋ถ์ ์กด์ฌํ๋ ๊ฐ์ด๋ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๋ฑ์ ํ์๋ก, ๋ ๋๋ง ๋ ์ดํ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ๋ถ์์ ์ธ ๊ฒ๋ค์ ์ง์นญ
uesEffect(() ⇒ { … } ,[deps])
- ๋ ๋ฒ์งธ ์ธ์์ธ deps์ state๊ฐ์ ๋ฃ๊ณ , state๊ฐ์ด ๋ณํ ๋๋ง๋ค ํด๋น useEffect๋ฅผ ์คํ.
- ๋น ๋ฐฐ์ด๋ก ์ ๋ ฅํ ๊ฒฝ์ฐ, ๋ ๋๋ง ํ 1๋ฒ๋ง ์คํ.
- ์ข ์์ฑ ๋ฐฐ์ด์ ์์ ์ง์ ํ์ง ์์์ ๊ฒฝ์ฐ, ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์คํ.
useEffect๊ฐ ์คํ๋๋ ์์ ์ ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ DOM์ ๋ฐ์๋ ๋, ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ง์ ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
2023.06.20 - [Front-End/React] - React ๋์ Mount & Rerender
(๋ง์ดํธ ๋ ๋ค์ ํธ์ถ๋๋๋ฐ, ๋ง์ดํธ์ ๋ ๋๋ง์ ๋ค์ ๊ฒ์๊ธ์์ ์ค๋ช
)
์
deps๋ฅผ ๋น๋ฐฐ์ด๋ก ๋ฃ์์ ๊ฒฝ์ฐ, ์ด๋ฏธ์ง์ ๊ฐ์ด ๊ฐ์ด ๋ณํ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์์กด์ฑ ๋ฐฐ์ด์ ๋ค๋ฅธ state๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋๋ก ๋์ํ๋์ง๋ ํ ์คํธํด๋ณผ ์ ์๊ณ , ๋น๋ฐฐ์ด ๋๋ ์ธ์๊ฐ ์์ฒด๋ฅผ ์ ๋ฃ์์ ๋, ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค useEffect๊ฐ ๋์ํ๋ ๊ฒ๋ ํ์ธํ ์ ์์ต๋๋ค.
์ฃผ์์ฌํญ
- useEffect ์ฌ์ฉ ์, props๋ฅผ deps์ ๋ฃ์ด์ฃผ๊ณ , ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ state๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด, ๋ฆฌ๋ ๋๋ง์ด ๋ง์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
function TodoList({ todos, filter }) {
const [newTodo, setNewTodo] = useState('');
// ๐ด Avoid: redundant state and unnecessary Effect
const [visibleTodos, setVisibleTodos] = useState([]);
useEffect(() => {
setVisibleTodos(getFilteredTodos(todos, filter));
}, [todos, filter]);
// ...
}
์์ ๊ฐ์ด useEffect์ todos, filter๋ฅผ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋, props๊ฐ์ด ๋ฐ๋๊ฒ ๋ ๊ฒ์ด๊ณ ,
๊ทธ๋ฌ๋ฉด ์์ ์ปดํฌ๋ํธ์ธ Todolist๋ ๋ณธ์ธ ์์ง์ ์๊ด์์ด ๋ค์ ํ๋ฒ ๋ฆฌ๋ ๋๋ง ๋๊ณ , useEffect๊ฐ ์คํ๋ ๊ฒ์ ๋๋ค.
์ถ๊ฐ๋ก useEffect์์ state๊ฐ ๋ฐ๋๊ฒ์ ์ธ์งํ๊ธฐ ๋๋ฌธ์ ์์ ์ปดํฌ๋ํธ๋ ํ๋ฒ ๋ ๋ฆฌ๋ ๋๋ง ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์์์ปดํฌ๋ํธ์์ ๋ง์ด ๋ฐ์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ ์ข์ต๋๋ค.
function TodoList({ todos, filter }) {
const [newTodo, setNewTodo] = useState('');
// โ
This is fine if getFilteredTodos() is not slow.
const visibleTodos = getFilteredTodos(todos, filter);
// useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํ ๊ฐ๋ฅ
const visibleTodos = useMemo(() => getFilteredTodos(todos, filter), [todos, filter]);
// ...
}
visibleTodo๊ฐ state๊ฐ์์ ์ง์ญ๋ณ์๋ก ๋ฐ๋์๋๋ฐ, ์ด์ฐจํผ ํ๋ฉด์ด ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค getFilteredTodos๊ฐ ์คํ๋ ๊ฒ์ด๊ณ , ์ ์ผ ์ต์ ๋ฐ์ดํฐ๋ก ๋ฆฌํดํ๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์คํ๋๋ ๊ฒ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๋ฉด, useMemo๋ฅผ ์ฌ์ฉํ์ฌ todos๋ filter๊ฐ ๋ณํ ๋๋ง๋ค ์คํํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
(useMemo๋ ๋ค์ ๊ฒ์๊ธ์...)
- ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
export default function ProfilePage({ userId }) {
const [comment, setComment] = useState('');
// ๐ด Avoid: Resetting state on prop change in an Effect
useEffect(() => {
setComment('');
}, [userId]);
// ...
}
๋ฌธ์ ์ ์ ์์ ๋น์ทํ๊ฒ userId์ ๋ฐ๋ผ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
export default function ProfilePage({ userId }) {
return (
<Profile
userId={userId}
key={userId}
/>
);
}
function Profile({ userId }) {
// โ
This and any other state below will reset on key change automatically
const [comment, setComment] = useState('');
// ...
}
Profile์ปดํฌ๋ํธ๋ฅผ ๋ด๋ถ์ ์๋ก ๋ง๋ค์ด์ comment๋ฅผ ์ด๊ธฐํ์์ผ์ค์ผ๋ก์จ, ๋ฆฌ๋ ๋๋ง์ ๋ง์ ์ ์์ต๋๋ค.
(userId์ ๋ฐ๋ผ Profile ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ...)
useEffect๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ hook ์ค ํ๋์ ๋๋ค.
๊ฐ๋จํ๊ฒ ์๊ฐํด์๋ useEffect๋ useState๋ง ์ ์ฌ์ฉํด๋, ๊ธฐ๋ณธ์ ์ธ ํ์ด์ง๋ค์ ์ถฉ๋ถํ ๋ง๋ค ์ ์์ ๊ฑฐ๋ก ๋ณด์ ๋๋ค.
'Front-End > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React] Strict Mode (0) | 2023.06.20 |
---|---|
React] Mount & Rerender (LifeSycle) (0) | 2023.06.20 |
React] Hook (0) | 2023.06.20 |
React] Hook : useState (1) | 2023.06.06 |
React] Hook : props (1) | 2023.06.06 |