Return ๋ฌธ์€ Hook ์•„๋ž˜์ชฝ์— ์žˆ์–ด์•ผํ•œ๋‹ค :Hook ๊ทœ์น™

2024. 1. 8. 16:14ยท frontEnd/React
๋ชฉ์ฐจ
  1. ๐ŸŒˆ ์—๋Ÿฌ
  2. โ˜€๏ธ Hook์˜ ๊ทœ์น™
  3. โญ๏ธ ์˜ˆ์‹œ)
  4. โœจ ์ฐธ๊ณ )

 

๐ŸŒˆ ์—๋Ÿฌ

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.  ์ฝ”๋“œ์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ž˜๋ชป ๋์„๊นŒ?? 

๋‹ต์€ 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
  1. ๐ŸŒˆ ์—๋Ÿฌ
  2. โ˜€๏ธ Hook์˜ ๊ทœ์น™
  3. โญ๏ธ ์˜ˆ์‹œ)
  4. โœจ ์ฐธ๊ณ )
'frontEnd/React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • path ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ
  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ : Socket.io
  • ์–ด๋–ค ํŽ˜์ด์ง€์— ์žˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ๋ ค์ฃผ๊ธฐ : NavLink
  • ๋™์  ๋ผ์šฐํŒ…์œผ๋กœ ๋ผ์šฐํŠธ ์„ค๊ณ„ : Route Parameter
kim_genius_
kim_genius_
#29์‚ด #๋น„์ „๊ณต์ž #์ƒˆ๋กœ์šด ๋„์ „ #day by day , in everyday, I am getting better and better
kim_genius_
Genius.Dev
kim_genius_
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (33)
    • books (0)
    • AI (2)
      • deepLearning (2)
    • backEnd (1)
      • Node.js (1)
    • frontEnd (26)
      • HTML_CSS_JS (5)
      • React (17)
      • TypeScript (2)
      • Next.js (2)
    • and so on (4)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
kim_genius_
Return ๋ฌธ์€ Hook ์•„๋ž˜์ชฝ์— ์žˆ์–ด์•ผํ•œ๋‹ค :Hook ๊ทœ์น™
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.