useImperativeHandle
useImperativeHandle
์ Ref๋ก ๋
ธ์ถ๋๋ ํธ๋ค์ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ React Hook์
๋๋ค.
useImperativeHandle(ref, createHandle, dependencies?)
๋ ํผ๋ฐ์ค
useImperativeHandle(ref, createHandle, dependencies?)
์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์์ useImperativeHandle
์ ํธ์ถํ์ฌ ๋
ธ์ถํ Ref ํธ๋ค์ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์ ์์ต๋๋ค.
import { useImperativeHandle } from 'react';
function MyInput({ ref }) {
useImperativeHandle(ref, () => {
return {
// ... ๋ฉ์๋๋ฅผ ์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์ ...
};
}, []);
// ...
์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์
-
ref
:MyInput
์ปดํฌ๋ํธ์ Prop์ผ๋ก ๋ฐ์ref
์ ๋๋ค. -
createHandle
: ์ธ์๊ฐ ์๊ณ ๋ ธ์ถํ๋ ค๋ Ref ํธ๋ค์ ๋ฐํํ๋ ํจ์์ ๋๋ค. ํด๋น Ref ํธ๋ค์ ์ด๋ ํ ์ ํ์ด๋ ๋ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ธ์ถํ๋ ค๋ ๋ฉ์๋๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. -
(์ ํ์ )
dependencies
:createHandle
์ฝ๋ ๋ด์์ ์ฐธ์กฐํ๋ ๋ชจ๋ ๋ฐ์ํ ๊ฐ์ ๋์ดํ ๋ชฉ๋ก์ ๋๋ค. ๋ฐ์ํ ๊ฐ์ Props, State ๋ฐ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ์ ์ธํ ๋ชจ๋ ๋ณ์์ ํจ์๋ฅผ ํฌํจํฉ๋๋ค. React์ ๋ํ ๋ฆฐํฐLinter๋ฅผ ๊ตฌ์ฑํ ๊ฒฝ์ฐ, ๋ชจ๋ ๋ฐ์ํ ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์์กด์ฑ์ผ๋ก ์ง์ ๋์๋์ง ํ์ธํฉ๋๋ค. ์์กด์ฑ ๋ชฉ๋ก์ ํญ์ ์ผ์ ํ ์์ ํญ๋ชฉ์ ๊ฐ์ง๊ณ[dep1, dep2, dep3]
์ ๊ฐ์ด ์ธ๋ผ์ธ์ผ๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค. React๋ ๊ฐ ์์กด์ฑ์Object.is
๋น๊ต๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค. ๋ฆฌ๋ ๋๋ง์ผ๋ก ์ธํด ์ผ๋ถ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋, ์ด ์ธ์๋ฅผ ์๋ตํ ๊ฒฝ์ฐcreateHandle
ํจ์๊ฐ ๋ค์ ์คํ๋๊ณ ์๋ก ์์ฑ๋ ํธ๋ค์ด Ref์ ํ ๋น๋ฉ๋๋ค.
๋ฐํ๊ฐ
useImperativeHandle
์ undefined
๋ฅผ ๋ฐํํฉ๋๋ค.
์ฌ์ฉ๋ฒ
๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ปค์คํ Ref ํธ๋ค ๋ ธ์ถ
๋ถ๋ชจ ์๋ฆฌ๋จผํธ์ DOM ๋
ธ๋๋ฅผ ๋
ธ์ถํ๋ ค๋ฉด ํด๋น ๋
ธ๋์ ref
Prop์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
function MyInput({ ref }) {
return <input ref={ref} />;
};
์์ ์ฝ๋์์ MyInput
์ ๋ํ Ref๋ <input>
DOM ๋
ธ๋๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ์ฌ์ฉ์ ์ง์ ๊ฐ์ ๋
ธ์ถํ ์ ์์ต๋๋ค. ๋
ธ์ถ๋ ํธ๋ค์ ์ฌ์ฉ์ ์ ์ํ๋ ค๋ฉด ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์์ useImperativeHandle
์ ํธ์ถํ์ธ์.
import { useImperativeHandle } from 'react';
function MyInput({ ref }) {
useImperativeHandle(ref, () => {
return {
// ... ๋ฉ์๋๋ฅผ ์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์ ...
};
}, []);
return <input />;
};
์์ ์ฝ๋์์ <input>
์ ๋ํ ref
๋ ๋์ด์ ์ ๋ฌ๋์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ์ฒด <input>
DOM ๋
ธ๋๋ฅผ ๋
ธ์ถํ์ง ์๊ณ focus
์ scrollIntoView
์ ๋ ๋ฉ์๋๋ง์ ๋
ธ์ถํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ค์ ๋ธ๋ผ์ฐ์ DOM์ ๋ณ๋์ Ref์ ์ ์งํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ useImperativeHandle
์ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ํธ์ถํ ๋ฉ์๋๋ง ์๋ ํธ๋ค์ ๋
ธ์ถํฉ๋๋ค.
import { useRef, useImperativeHandle } from 'react';
function MyInput({ ref }) {
const inputRef = useRef(null);
useImperativeHandle(ref, () => {
return {
focus() {
inputRef.current.focus();
},
scrollIntoView() {
inputRef.current.scrollIntoView();
},
};
}, []);
return <input ref={inputRef} />;
};
์ด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ MyInput
์ ๋ํ Ref๋ฅผ ๊ฐ์ ธ์ค๋ฉด focus
๋ฐ scrollIntoView
๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ <input>
DOM ๋
ธ๋์ ์ ์ฒด ์์ธ์ค ๊ถํ์ ์์ต๋๋ค.
import { useRef } from 'react'; import MyInput from './MyInput.js'; export default function Form() { const ref = useRef(null); function handleClick() { ref.current.focus(); // ์ด ์์ ์ DOM ๋ ธ๋๊ฐ ๋ ธ์ถ๋์ง ์์ผ๋ฏ๋ก ์๋ํ์ง ์์ต๋๋ค. // ref.current.style.opacity = 0.5; } return ( <form> <MyInput placeholder="Enter your name" ref={ref} /> <button type="button" onClick={handleClick}> Edit </button> </form> ); }
์ฌ์ฉ์ ์ ์ Imperative ๋ฉ์๋ ๋ ธ์ถ
Imperative Handle์ ํตํด ๋
ธ์ถํ๋ ๋ฉ์๋๋ DOM ๋ฉ์๋์ ์ ํํ๊ฒ ์ผ์นํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด Post
์ปดํฌ๋ํธ๋ Imperative Handle์ ํตํด scrollAndFocusAddComment
๋ฉ์๋๋ฅผ ํ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ชจ Page
์์ ๋ฒํผ์ ํด๋ฆญํ ๋ ๋๊ธ ๋ชฉ๋ก์ ์คํฌ๋กคํ๊ณ ์
๋ ฅ ํ๋์ ์ด์ ์ ๋ง์ถ ์ ์์ต๋๋ค.
import { useRef } from 'react'; import Post from './Post.js'; export default function Page() { const postRef = useRef(null); function handleClick() { postRef.current.scrollAndFocusAddComment(); } return ( <> <button onClick={handleClick}> Write a comment </button> <Post ref={postRef} /> </> ); }