-
[react] forwardRefJavaScript 2022. 3. 2. 08:16
Forward Ref
useRef 를 사용해 엘리먼트를 참조할 때, ref 를 자식 컴포넌트에게 props 로 전달 할 수 없다.
export default function Children(props) { const ref = props.ref; // 에러발생 console.log(ref); // 에러발생 return <button>클릭</button>; }
이때 forward ref 를 사용하면, 부모에서 정의한 ref 로 자식의 엘리먼트를 참조 할 수 있다!!
(참고로 forwarding 은 전송이라는 뜻이며 즉, ref 를 자식 컴포에게 전송한다 라는 의미이다.)
코드
부모컴포넌트
import { ConstTypeChild } from "./ConstTypeChild"; import FunctionTypeChild from "./FunctionTypeChild"; import { useRef, useState, useEffect } from "react"; export default function Parent() { const constref = useRef(); const functionref = useRef(); const [toggle, setToggle] = useState([false]); const onClick = () => { setToggle(!toggle); }; useEffect(() => { if (toggle) { constref.current.style = "width:300px; height:300px; background:red;"; functionref.current.style = "width:300px; height:300px; background:red;"; } else { constref.current.style = "width:300px; height:300px; background:blue;"; functionref.current.style = "width:300px; height:300px; background:blue;"; } }, [toggle]); return ( <> <FunctionTypeChild onClick={onClick} ref={constref}></FunctionTypeChild> <ConstTypeChild onClick={onClick} ref={functionref}></ConstTypeChild> </> ); }
Child1 (Const Type)
import { forwardRef } from "react"; const ConstTypeChild = forwardRef((props, ref) => { const onClick = props.onClick; return ( <button ref={ref} onClick={() => onClick()}> constTypeButton ); }); ConstTypeChild.displayName = "ConstTypeChild"; // 리액트 컴포넌트 디버깅 툴로 봤을때 이 코드가 // 없으면 컴포 이름이 forwarding ref 로 뜸 export { ConstTypeChild };
Child2 (function Type)
import { forwardRef } from "react"; function FunctionTypeChild(props, ref) { const onClick = props.onClick; return ( FunctionType ); } FunctionTypeChild = forwardRef(FunctionTypeChild); // 리액트 컴포넌트 디버깅 툴로 봤을때 이 코드가 // 없으면 컴포 이름이 forwarding ref 로 뜸 export default FunctionTypeChild;
reference
https://github.com/gaki2/forwarding-refs
https://en.reactjs.org/docs/forwarding-refs.html'JavaScript' 카테고리의 다른 글
[React]How to optimize context value (번역) (0) 2022.03.03 [react] Fragments (0) 2022.03.02 [개발일지] 2.8 에러메세지는 구체적으로 콘솔에 띄우기 (0) 2022.02.08 2.7 개발일지 (0) 2022.02.08 미디어쿼리 (0) 2022.02.07