ํฌ์ŠคํŠธ

๐ŸŒ’ React Native ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ - Hook

๐Ÿ’ซ ๋ฆฌ์•กํŠธ ํ›… - React Hooks


@ U ์ค‘๊ฐ„๊ณ ์‚ฌ ์ถœ์ œ : ๋ฆฌ์•กํŠธ ํ›… & ์ƒํƒœ ๊ฐœ๋…

React ํ”„๋ ˆ์ž„์›Œํฌ,

์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฒ•์œผ๋กœ ๊ฐ€์ƒ DOM ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ ๋‚˜์„œ,
๊ฐ€์ƒ DOM ๊ฐ์ฒด์— ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜๋ฉด, ํ•ด๋‹น ๋ณ€ํ™”๋งŒ ์žฌ๋ Œ๋”๋งํ•˜์—ฌ ์ „์ฒด ๋ Œ๋”๋ง ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ

Old
๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ์ƒ์† ๊ฐœ๋…์— ๋งž์ถ˜, ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ์ œ์ž‘๋˜์—ˆ์Œ
โ†’ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ˆ  โ† ์ฝ”๋“œ ์ž‘์„ฑ ๋ณต์žก
โ†’ 60/1s ๊ฐ™์€ ๋น ๋ฅธ ์žฌ๋ Œ๋”๋ง ์‹œ ์ •์ƒ์ ์ธ ๋ Œ๋”๋ง์ด ์•ˆ๋˜๋Š” ๋ฒ„๊ทธ

New
๊ตฌํ˜„ ๋ณต์žกํ•จ์„ ๋œ์–ด๋‚ด๊ณ ์ž ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก
ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ๊ฐ’์„ Persistence - ์œ ์ง€ ํ•  ์ˆ˜ ์žˆ๋„๋ก, New ๋ฐ์ดํ„ฐ Cache ์‹œ์Šคํ…œ
Cache ์‹œ์Šคํ…œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก use~ ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์—ฌ๋Ÿฌ API ์ œ๊ณต
โ†’ React Hooks - ๋ฆฌ์•กํŠธ ํ›…

์ฆ‰, ํ•จ์ˆ˜ ๋‚ด ๋กœ์ปฌ๋ณ€์ˆ˜๋ฅผ ํด๋ž˜์Šค์˜ ์ „์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด

๋กœ์ปฌ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ ,
์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋””์ธ๊ฐ€ ์บ์‹œํ•˜๊ณ ์„œ
๋กœ์ปฌ๋ณ€์ˆ˜๋Š” ํ•„์š”ํ•  ๋•Œ ์บ์‹œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ํ‚ค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆ โ†’ Reference

@ ํฌ์ธํ„ฐ, ์ฐธ์กฐํƒ€์ž… ์œ ์‚ฌํ•œ ๊ฐœ๋…์ธ๋“ฏ?

์›๋ž˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ,
๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•œ useMemo ํ›…์„ ํ†ตํ•ด ์‚ฌ์šฉ

โ†“ ์•„๋ž˜๋Š” ๊ธฐ์กด ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

const cache: Record<string, any> = {}

export const createOrUse = <T>(key: string, callback: () => T) =>
{
	if (!cache[key])
		cache[key] = callback()
	return cache[key]
}

const temp = createOrUse('Temp', () => createTemp)

/*
	Record<Key, Type>
	TypeScript์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด ํƒ€์ž…
	Type์€ ์•„๋ฌด ํƒ€์ž…์ด๋‚˜ ์˜ฌ ์ˆ˜ ์žˆ์Œ

	์žˆ์œผ๋ฉด ๊บผ๋‚ด์„œ ๋ฐ˜ํ™˜  
	์—†์œผ๋ฉด callback์œผ๋กœ ์ดˆ๊ธฐํ™” ํ›„ ๋ฐ˜ํ™˜  
*/

i.e.
์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ - useMemo, useCallback, useState, useReducer
์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋Œ€์‘ - useEffect, useLayoutEffect
์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ •๋ณด ๊ณต์œ  - useContext
์ปดํฌ๋„ŒํŠธ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ - useRef, useImperativeHandle

๐Ÿ’ซ ์˜์กด์„ฑ - Dependency


์บ์‹œ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผํ•˜๋Š” ํŠน์ • ์กฐ๊ฑด/์ƒํ™ฉ๋“ค

์˜์กด์„ฑ ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑ๋˜๋ฉด,
์ž๋™์œผ๋กœ ์บ์‹œ ๊ฐฑ์‹  (์ฝœ๋ฐฑ) โ†’ ์žฌ๋ Œ๋”๋ง

๐Ÿ’ซ useMemo


@ U ๊ธฐ๋ง๊ณ ์‚ฌ ์ถœ์ œ : useMemo

1
2
3
4
const ์บ์‹œ๋œ_๋ฐ์ดํ„ฐ = useMemo(์ดˆ๊ธฐ๊ฐ’, [์˜์กด์„ฑ1, ์˜์กด์„ฑ2, ...])

const ์บ์‹œ๋œ_๋ฐ์ดํ„ฐ = useMemo(์ฝœ๋ฐฑ, [์˜์กด์„ฑ1, ์˜์กด์„ฑ2, ...])
์ฝœ๋ฐฑ = () => ์ดˆ๊ธฐ๊ฐ’

๊ฐ’(, ํ•จ์ˆ˜)์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜
โ†’ ํ•จ์ˆ˜ : () => ์ฝœ๋ฐฑ

useCallback์ด ์žˆ๋Š”๋ฐ, useMemo๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•˜๋Š” ๊ฒฝ์šฐ?
โ†’ useMemo๋ฅผ ์“ฐ๋ฉด ํ•จ์ˆ˜์™€ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ’์„ ํ•จ๊ป˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

@ 222p, useMemo(() => fibonacci, [])... ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ (๊ธฐ๋ง๊ณ ์‚ฌ X)

๐Ÿ’ซ useCallback


@ U ๊ธฐ๋ง๊ณ ์‚ฌ ์ถœ์ œ : useCallback

1
const ์บ์‹œ์ฝœ๋ฐฑ = useCallback(์ดˆ๊ธฐ์ฝœ๋ฐฑ, [์˜์กด์„ฑ1, ์˜์กด์„ฑ2, ...])

ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

์žฌ๋ Œ๋”๋ง๋งˆ๋‹ค ์ง€์†์ ์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ, useCallback์„ ํ†ตํ•ด ์ €์žฅํ•ด์„œ ์žฌ์‚ฌ์šฉ

๐Ÿ’ซ ์ƒํƒœ


@ U ์ค‘๊ฐ„๊ณ ์‚ฌ ์ถœ์ œ : ๋ฆฌ์•กํŠธ ํ›… & ์ƒํƒœ ๊ฐœ๋…

์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๊ฐ’์ด ์œ ์ง€๋˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ์„œ๋Š” ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฒƒ
ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ์†์„ฑ์ด๋‚˜ ์ „์—ญ ๋ณ€์ˆ˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉฐ, ๋ณดํ†ต ํ•จ์ˆ˜ ๋ชธํ†ต์˜ ์ง€์—ญ ๋ณ€์ˆ˜ ํ˜•ํƒœ๋กœ๋Š” ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•จ

๐Ÿ’ซ useState


@ U ์ค‘๊ฐ„๊ณ ์‚ฌ ์ถœ์ œ : ๋ฆฌ์•กํŠธ ํ›… & ์ƒํƒœ ๊ฐœ๋…
@ U ๊ธฐ๋ง๊ณ ์‚ฌ ์ถœ์ œ : useState

1
2
3
4
5
6
7
8
9
10
import React, {useState} from 'react'

{ /* ํƒ€์ž… ์ •์˜, S - State Type */ }
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>]

{ /* ์‚ฌ์šฉ ๋ฐฉ๋ฒ• */ }
const [๊ฐ’, Setter] = useState(์ดˆ๊นƒ๊ฐ’)
const [๊ฐ’, Setter] = useState<S>(์ดˆ๊นƒ๊ฐ’)
{ /* ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜ (Setter)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ’ ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ๋ Œ๋”๋ง */}
{ /* ์žฌ๋ Œ๋”๋ง ๋•Œ๋ฌธ์— useState ํ›…์€ ๊ฐ’๊ณผ Setter ํ•จ์ˆ˜๋ฅผ Tuple ํ˜•ํƒœ์˜ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ */}

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ์†์„ฑ์ฒ˜๋Ÿผ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค

์ƒํƒœ ์ €์žฅ (์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ)

@ ๋ฐฐ์—ด์— ์ ์šฉํ•˜๋Š” ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๊ตฌ๋ฌธ
ํ• ๋‹น ๋ฐ›๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ž์œ ๋กญ๊ฒŒ

@ ๊ฐ์ฒด์— ์ ์šฉํ•˜๋Š” ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๊ตฌ๋ฌธ

๐Ÿ’ซ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ


์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ตœ์ดˆ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋๋งˆ์นจ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งˆ์šดํŠธํ–ˆ๋‹ค. - Mount

๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ตฌํ˜„ ๋กœ์ง์— ๋”ฐ๋ผ ์žฌ๋ Œ๋”๋ง์„ ๊ฑฐ๋“ญํ•˜๋‹ค, ์–ด๋–ค ์‹œ์ ์—์„œ ๊ตฌํ˜„ ๋กœ์ง์— ์˜ํ•ด ํŒŒ๊ดด๋˜์–ด ์‚ฌ๋ผ์ง

์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŒŒ๊ดด๋˜์–ด ๋”๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์Œ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋๋‹ค. - Unmount

๋งˆ์šดํŠธ ~ ์–ธ๋งˆ์šดํŠธ ๊ณผ์ •์„ ํ•ฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ผ ํ‘œํ˜„ํ•œ๋‹ค. - Lifecycle

๐Ÿ’ซ useEffect, useLayoutEffect


@ U ์ค‘๊ฐ„๊ณ ์‚ฌ ์ถœ์ œ : useEffect
@ U ๊ธฐ๋ง๊ณ ์‚ฌ ์ถœ์ œ : useEffect (setInterval?)

์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๊ด€๋ จ์žˆ๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ํ›….
์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ, ์˜์กด ๋ชฉ๋ก ์กฐ๊ฑด, ์–ธ๋งˆ์šดํŠธ ์‹œ ์ฒ˜๋ฆฌ ํ•  ์ž‘์—….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{ /* React Hook, React๊ฐ€ ์ œ๊ณต */}
import React, {useEffect} from 'react'

{ /* ์˜์กด์„ฑ ๋ชฉ๋ก์— ์žˆ๋Š” ์กฐ๊ฑด ์ค‘ ์–ด๋Š ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑ๋˜๋ฉด ๊ทธ๋•Œ๋งˆ๋‹ค ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰ */}
useEffect(์ฝœ๋ฐฑ, ์˜์กด์„ฑ๋ชฉ๋ก)
useLayoutEffect(์ฝœ๋ฐฑ, ์˜์กด์„ฑ๋ชฉ๋ก)

์ฝœ๋ฐฑ = () => { }
{ /* ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋„ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ, ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ๋งˆ์šดํŠธ ํ•  ๋•Œ ๋‹จ ํ•œ ๋ฒˆ ์‹คํ–‰ ๋จ*/}
์ฝœ๋ฐฑ = () => { return ๋ฐ˜ํ™˜ํ•จ์ˆ˜ }

{ /* ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์˜์กด์„ฑ ๋ชฉ๋ก์— ๋นˆ ๋ฐฐ์—ด [] */}
useEffect(() => {}, [])

{ /* ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ */}
useEffect(() => { /* some */ return () => {} }, [])

{ /* setInterval ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์žฌ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰๋˜๊ธฐ์— */}
{ /* useEffect(() => {}, [])๋ฅผ ํ†ตํ•ด ์ฒ˜์Œ ๋งŒ๋“ค์–ด์งˆ ๋•Œ๋งŒ ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋„๋ก */}

์ฝœ๋ฐฑ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•  ๋•Œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•œ๋‹ค.

์˜์กด์„ฑ์ด ๋ณ€ํ™”ํ•˜๋ฉด ์ฝœ๋ฐฑ์ด ๋ฐ˜ํ™˜ํ•œ ์ข…๋ฃŒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝœ๋ฐฑ์„ ํŒŒ๊ดดํ•˜๊ณ , ์ž์‹ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅํ•œ ์ฝœ๋ฐฑ์„ ๋‹ค์‹œ ํ˜ธ์ถœ
@ TODO : ์ดํ•ด ๋ชปํ•จ

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”์–ด ์ปดํฌ๋„ŒํŠธ๋Š” onLayout ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค, โ€˜react-nativeโ€™ ํŒจํ‚ค์ง€๋Š” LayoutChangeEvent ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค.

LayoutChangeEvent๋Š” onLayout ์ด๋ฒคํŠธ ์†์„ฑ์— ์„ค์ •ํ•˜๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด๋‹ค.

LayoutChangeEvent์˜ nativeEvent ์†์„ฑ์„ ํ†ตํ•ด ํŠน์ • ํƒ€์ž… layout์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
const onLayout = (e: LayoutChangeEvent) => { /* e.nativeEvent ~ */}

export interface LayoutChangeEvent
{
	nativeEvent:
	{
		layout: LayoutRectangle;
	};
}

onLayout ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๋๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋งˆ์šดํŠธ ๊ณผ์ •
์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์‹œ์ž‘ โ†’ useLayoutEffect โ†’ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚จ โ†’ useEffect โ†’ onLayout

์–ธ๋งˆ์šดํŠธ ๊ณผ์ •
์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ์ž‘ โ†’ useEffect ๋ฐ˜ํ™˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ useLayoutEffect ๋ฐ˜ํ™˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ ์ปดํฌ๋„ŒํŠธ ํŒŒ๊ดด

useLayoutEffect ํ›…์€ ๋™๊ธฐ Synchronous๋กœ ์‹คํ–‰ํ•˜๊ณ , useEffect ํ›…์€ ๋น„๋™๊ธฐ Asynchronous๋กœ ์‹คํ–‰ํ•œ๋‹ค.

useLayoutEffect ํ›…์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , useEffect ํ›…์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด useEffect ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (๋ฆฌ์•กํŠธ ๊ณต์‹ ๋ฌธ์„œ ๊ถŒ์žฅ ์‚ฌํ•ญ)

๐Ÿ’ซ ์ปค์Šคํ…€ ํ›… - Custom Hook


Something like Design Pattern

์—ฌ๋Ÿฌ ๋ฆฌ์•กํŠธ ํ›…๊ณผ ์ปค์Šคํ…€ ํ›…์„ ์กฐํ•ฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ›… ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ์˜ ํ›… ํ•จ์ˆ˜ ์ฝ”๋“œ ํŒจํ„ด์ด ๋น„์Šทํ•˜๊ธฐ์—, ์ด๋Ÿฐ ํ›… ํ˜ธ์ถœ์„ ์กฐํ•ฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ถ”์ƒํ™”, ๊ธด ์ฝ”๋“œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ)

๋ฆฌ์•กํŠธ ํ›…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•จ์ˆ˜ ์ด๋ฆ„์€ ํ•ญ์ƒ โ€˜use~โ€™๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

useHooks, useHooks-ts ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งŒ๋“  ํ›…, ํ›… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ซ useRef, useImperativeHandle


Context, Ref

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.