Open beecomci opened 3 years ago
ref
๊ทธ ์ธ์๋ ๋๋๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
๐ก์ ์ธ์ (declartive)์ผ๋ก ์๊ฐํ๊ธฐ => Dialog component์ open(), close() ํจ์๋ฅผ ๋ ธ์ถํ๊ธฐ ๋ณด๋ค๋(๋ช ๋ นํ) isOpen ๊ฐ(์ํ๊ฐ)์ ์ ๋ฌํ์ฌ ์ ์ดํ๋๋ก ํ๋ค. ์ํ์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋ฆฌ๋๋ก React์๊ฒ ์์, Dialog ๋ด์์๋ isOpen์ ์ํ๊ฐ์ ๋ง๋ ํ๋ฉด ์ ์๊ฐ ์ ๋์ด ์์ผ๋ฉด Dialog๊ฐ ๋ฐ๋ props(isOpen)์ผ๋ก ์ ์ด๋จ
Dialog
open()
close()
isOpen
@07-refs/dom
import { useRef } from 'react'; const TextInput = () => { // DOM ์ ๊ทผ์ ref ์ฌ์ฉ const textInputRef = useRef(null); const focusInput = () => { // ์ ๊ทผ์ current๋ก ์ ๊ทผํ๋ฉด ์ค์ dom ์ ๊ทผ textInputRef.current.focus(); } return ( <div> <input type="text" ref={textInputRef} // React๊ฐ ์ค์ DOM render ํ reference๋ฅผ ๋ถ์ฌ์ค /> <button onClick={focusInput}> Focus </button> </div> ); }
useImperativeHandle
@07-refs/forward
import { useRef, forwardRef, useImperativeHandle, useEffect } from 'react'; function AutoFocusTextInput() { const inputRef = useRef(null); useEffect(() => { inputRef.current.focusInput(); }, []); // mount ๋์์ ๋ 1๋ฒ๋ง ์คํ return <ForwaredTextInput ref={inputRef} />; } // forwardRef๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ref ์ ๋ฌ๋ฐ๊ธฐ ๊ฐ๋ฅ function TextInput(props, ref) { const textInput = useRef(null); const focusInput = () => { textInput.current.focus(); } // focuseInput ํจ์๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๊ฒ ๋ฐ useImperativeHandle(ref, () => ({ focusInput })) return ( <div> <input type="text" ref={textInput} /> <button onClick={focusInput}> Focus </button> </div> ); } // forwardRef๋ก ๊ฐ์ผ TextInput ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ ForwaredTextInput์ ์ ๋ฌ // ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ํด๋น ์ปดํฌ๋ํธ ์ฌ์ฉ์ ref ์ฃผ์ const ForwaredTextInput = forwardRef(TextInput) export default AutoFocusTextInput; // ์ง๊ธ์ฒ๋ผ ์์ ์ปดํฌ๋ํธ์์ ๋ถํธํ๊ฒ ์ ์ดํ์ง ์๊ณ TextInput์ props์ isAutoFocus flag ์ ๋ฌ๋ก ๋ด๋ถ์์ flag ์ํ๊ฐ์ ๋ฐ๋ฅธ render๋ฅผ ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ ์ถ์ฒ
๐ useRef ์ฌ์ฉ์ ์ธ์ ?
DOM์
ref
์ฌ์ฉํ๊ธฐ ์ข์ ์๊ทธ ์ธ์๋ ๋๋๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ๊น?
@07-refs/dom
forwardRef
ref
์ ํ์ commponent์ ref๋ฅผ ์ ๋ฌuseImperativeHandle
hook๊ณผ ๊ฐ์ด ์ฌ์ฉ@07-refs/forward