๐ ์๋ฌ
์๋ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ์ด๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค. ์ฝ๋์์ ์ด๋ค ๋ถ๋ถ์ด ์๋ชป ๋์๊น??
๋ต์ if ๋ฌธ์ return ๊ฐ์ด hook์ธ useEffect ๋ณด๋ค ์์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ผ์ด๊ฒ ์ ์๋ชป๋ ๊ฒ์ผ๊น??
์ด๊ฒ์ ์ดํดํ๊ธฐ ์ํด์ Hook ์๋์๋ฆฌ์ ๋ํด์ ์ดํดํด์ผํ๋ค.
Error
Rendered more hooks than during the previous render.
function Form() {
const [name, setName] = useState('Mary');
if(!name == ''){return null}
useEffect(function persistForm() {
localStorage.setItem('formData', name);
});
}
โ๏ธ Hook์ ๊ท์น
Hook์ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋ ๋๋ง๋ค ํญ์ ๋์ผํ ์์ ๋ก ํธ์ถ๋๋๋ก ๋ณด์ฅ๋์ผํ๋ค.
1) ์ต์์(at the Top Level)์์๋ง Hook์ ํธ์ถํด์ผ ํ๋ค.
=> ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํน์ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํ๋ฉด ์๋๊ณ early return์ด ์คํ๋๊ธฐ ์ ์ hook๋ฅผ ํธ์ถํด์ผํ๋ค
2) ์ค์ง React ํจ์ ๋ด์์ Hook์ ํธ์ถํด์ผ ํ๋ค.
โญ๏ธ ์์)
์๋ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ์ด๋ค ๋๋๋ง์ด ์คํ๋ ๊น?
function Form() {
// 1. name์ด๋ผ๋ state ๋ณ์๋ฅผ ์ฌ์ฉํ์ธ์.
const [name, setName] = useState('Mary');
// 2. Effect๋ฅผ ์ฌ์ฉํด ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ธ์.
useEffect(function persistForm() {
localStorage.setItem('formData', name);
});
// 3. surname์ด๋ผ๋ state ๋ณ์๋ฅผ ์ฌ์ฉํ์ธ์.
const [surname, setSurname] = useState('Poppins');
// 4. Effect๋ฅผ ์ฌ์ฉํด์ ์ ๋ชฉ์ ์
๋ฐ์ดํธํฉ๋๋ค.
useEffect(function updateTitle() {
document.title = name + ' ' + surname;
});
// ...
}
์๋๊ฐ์ ๋๋๋ง ์์๊ฐ ๋ํ๋๋ค. ์ฆ hook์ ์ฒซ๋ฒ์งธ,๋๋ฒ์งธ,์ธ๋ฒ์งธ... ๋๋๋ง์ด ์งํ๋๋๋ผ๋ ๋์ผํ ์์๋ก ํธ์ถ๋์ผํ๋ค.
// ------------
// ์ฒซ ๋ฒ์งธ ๋ ๋๋ง
// ------------
useState('Mary') // 1. 'Mary'๋ผ๋ name state ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
useEffect(persistForm) // 2. ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ effect๋ฅผ ์ถ๊ฐํฉ๋๋ค.
useState('Poppins') // 3. 'Poppins'๋ผ๋ surname state ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
useEffect(updateTitle) // 4. ์ ๋ชฉ์ ์
๋ฐ์ดํธํ๊ธฐ ์ํ effect๋ฅผ ์ถ๊ฐํฉ๋๋ค.
// -------------
// ๋ ๋ฒ์งธ ๋ ๋๋ง
// -------------
useState('Mary') // 1. name state ๋ณ์๋ฅผ ์ฝ์ต๋๋ค.(์ธ์๋ ๋ฌด์๋ฉ๋๋ค)
useEffect(persistForm) // 2. ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ effect๊ฐ ๋์ฒด๋ฉ๋๋ค.
useState('Poppins') // 3. surname state ๋ณ์๋ฅผ ์ฝ์ต๋๋ค.(์ธ์๋ ๋ฌด์๋ฉ๋๋ค)
useEffect(updateTitle) // 4. ์ ๋ชฉ์ ์
๋ฐ์ดํธํ๊ธฐ ์ํ effect๊ฐ ๋์ฒด๋ฉ๋๋ค.
// ...
๊ทธ๋ฐ๋ฐ ๊ฐ์์ค๋ ์๋ ์ฒ๋ผ useEffect ๋ฅผ if ๋ฌธ์ผ๋ก ๊ฐ์ธ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊น?
// ๐ด ์กฐ๊ฑด๋ฌธ์ Hook์ ์ฌ์ฉํจ์ผ๋ก์จ ์ฒซ ๋ฒ์งธ ๊ท์น์ ๊นผ์ต๋๋ค
if (name !== '') {
useEffect(function persistForm() {
localStorage.setItem('formData', name);
});
}
Hook์ ์คํ์์์์ ๋๋ฒ์งธ ๋๋๋ง์์ useEffect(persisitForm)์ด ์๋ต๋๋ค. name์ 'Mary'์ด ํ ๋น๋์๊ธฐ ๋๋ฌธ.
์ด๋ก ์ธํด ์ฒซ๋ฒ์งธ ๋๋๋ง๊ณผ ๋๋ฒ์งธ ๋๋๋ง ์ hooks์ ํธ์ถ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์๋ฌ๊ฐ ๋ํ๋๋ค.
useState('Mary') // 1. name state ๋ณ์๋ฅผ ์ฝ์ต๋๋ค. (์ธ์๋ ๋ฌด์๋ฉ๋๋ค)
// useEffect(persistForm) // ๐ด Hook์ ๊ฑด๋๋ฐ์์ต๋๋ค!
useState('Poppins') // ๐ด 2 (3์ด์๋). surname state ๋ณ์๋ฅผ ์ฝ๋ ๋ฐ ์คํจํ์ต๋๋ค.
useEffect(updateTitle) // ๐ด 3 (4์๋). ์ ๋ชฉ์ ์
๋ฐ์ดํธํ๊ธฐ ์ํ effect๊ฐ ๋์ฒด๋๋ ๋ฐ ์คํจํ์ต๋๋ค.
๋ฐ๋ผ์ Hook์ ์ปดํฌ๋ํธ ์ต์๋จ์์ ํธ์ถํด์ผ ๊ฐ์ญ์์ ์์ ๋ก์ธ ์ ์๋ค. ๋ํ ์กฐ๊ฑด๋ฌธ์ ์ฐ๋ ค๋ฉด Hook ์์์ ์จ์ผํ๋ค.
โจ ์ฐธ๊ณ )
https://ko.legacy.reactjs.org/docs/hooks-rules.html#explanation
Hook์ ๊ท์น – React
A JavaScript library for building user interfaces
ko.legacy.reactjs.org
'frontEnd > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
path ๊น๋ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ (0) | 2024.02.05 |
---|---|
์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ : Socket.io (0) | 2024.01.09 |
์ด๋ค ํ์ด์ง์ ์๋์ง ์ฝ๊ฒ ์๋ ค์ฃผ๊ธฐ : NavLink (0) | 2024.01.05 |
๋์ ๋ผ์ฐํ ์ผ๋ก ๋ผ์ฐํธ ์ค๊ณ : Route Parameter (0) | 2024.01.04 |
ํ์ด์ง ์์ ํ์ด์ง ์์ ํ์ด์ง ... : ์ค์ฒฉ๋ผ์ฐํ (0) | 2023.12.31 |