๐Ÿ“

19. Custom Hook

Custom hook?

useState, useEffect๋“ฑ Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ์—๋Š” ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง๋“ค์„ ๋งŽ์ด ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์ฃ . JS์—์„œ๋Š” ์ค‘๋ณต๋œ ๋กœ์ง์„ ํ•จ์ˆ˜๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋ฝ‘์•„๋ƒˆ๋Š”๋ฐ์š”. ๋ฆฌ์•กํŠธ์—์„œ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ ์‹ถ์€๊ฒŒ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ์ค‘๋ณต๋˜๋Š” Hook์„ ์šฐ๋ฆฌ ๋งˆ์Œ๋Œ€๋กœ ๋งŒ๋“ค์–ด ๋ถ„๋ฆฌํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Custom Hook ์‚ฌ์šฉํ•˜๊ธฐ

์•„๋ž˜์™€๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ 2๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
import React, { useState } from 'react'; function InputComponent() { const [value, setValue] = useState('') function onChange(e) { setValue(e.target.value) } return ( <> <input type="text" onChange={onChange}/> <div> {value} </div> </> ) } export default InputComponent
src/Components/InputComponent.jsx
import React, { useState } from 'react'; function SomethingComponent() { const [value, setValue] = useState('') function onChange(e) { setValue(e.target.value) } return ( <> <input type="text" onChange={onChange}/> <div> {value}๊ฐ€ ๊ฐ•ํ•ด์กŒ๋‹ค ๋Œ๊ฒฉํ•ด! </div> </> ) } export default SomethingComponent
src/Components/SomethingComponent.jsx
์ž…๋ ฅ์ฐฝ์—์„œ ์ž…๋ ฅํ•œ๊ฐ’์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” onChange๋ถ€๋ถ„์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. SomethingComponent์™€ InputComponent์—์„œ ๋˜‘๊ฐ™์€ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ ํ•˜๋ฉด ์•ˆ๋˜์ฃ . ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Hookํด๋”๋ฅผ ๋งŒ๋“  ํ›„ useInput.jsํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š” ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค. ํ›…์˜ ์ด๋ฆ„์€ ํ•ญ์ƒ โ€œuseNameโ€ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ๋ณด์‹œ๋ฉด ์ด์ „์— ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ค‘๋ณต ๋˜์–ด์žˆ๋Š” ๋กœ์ง๊ณผ ๋™์ผํ•œ ๋ถ€๋ถ„์ด ๊ทธ๋Œ€๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌํ„ด์œผ๋กœ value๊ฐ’๊ณผ ์ƒํƒœ๋ฅผ ์กฐ์ž‘ํ•ด์ฃผ๋Š” onChangeํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค„๊ฑฐ์—์š”.
notion imagenotion image
import { useState } from 'react'; function useInput(initState) { const [value, setValue] = useState(initState) function onChange(e) { setValue(e.target.value) } return [value, onChange] } export default useInput
src/Hook/useInpu.jsx
์ž‘์„ฑํ•˜์…จ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ์•„์™€์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๊น”๋”ํ•ด์ง„ ๋ชจ์Šต์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
import React from 'react'; import useInput from '../Hook/useInput' function InputComponent() { const [value, onChange] = useInput("") return ( <> <input type="text" onChange={onChange}/> <div> {value} </div> </> ) } export default InputComponent
InputComponent.jsx
import React from 'react'; import useInput from '../Hook/useInput' function SomethingComponent() { const [value, onChange] = useInput("") return ( <> <input type="text" onChange={onChange}/> <div> {value}๊ฐ€ ๊ฐ•ํ•ด์กŒ๋‹ค ๋Œ๊ฒฉํ•ด! </div> </> ) } export default SomethingComponent
SomethingComponent.jsx
App.js์— ๋ชจ์•„์„œ ๋ณผ์ˆ˜์žˆ๋Š” ์˜ˆ์ œ
import React, { useState } from 'react'; function useInput() { const [value, setValue] = useState('') function onChange(e) { setValue(e.target.value) } return [value, onChange] } function InputComponent() { const [value, onChange] = useInput('') return ( <> <input type="text" onChange={onChange}/> <div> {value} </div> </> ) } function SomethingComponent() { const [value, onChange] = useInput('') return ( <> <input type="text" onChange={onChange}/> <div> {value}๊ฐ€ ๊ฐ•ํ•ด์กŒ๋‹ค ๋Œ๊ฒฉํ•ด! </div> </> ) } function App(){ return( <> <InputComponent/> <SomethingComponent/> </> ) } export default App