λ³΄ν΅ useRef κΉμ§λ ννλ€ μλ€κ³ μκ°νλλ°,
λ§μ½ λ΄κ° μ΄λ€ κ³³μμ μ»΄ν¬λνΈλ€μ μΌκ΄λ‘ μ μν΄λκ³ , λΆλͺ¨ λ¨μμ κΊΌλ΄μ΄μ μ¬μ©νλ ννμ λ‘μ§μ μ§ λ€λ©΄ μ΄λ»κ² λ κΉ? μ΄λλ refλ₯Ό λ€λ£¨λ caseκ° μ‘΄μ¬νλ€λ©΄?
β
μ λ΅μ ForwardRef μ΄λ€. λΆλͺ¨μμ μμμ ref μμλ€μ λ€λ£¨κ³ μΆμ λ μ¬μ©νλ λ¬Έλ².
β
λ,
μμλ¨μ μλ function μ λΆλͺ¨μμ μ¬μ©νκ³ μΆλ€λ©΄?
(보ν΅μ λΆλͺ¨μμ μ¬μ©νλ κ²μ΄ λ§μ§λ§, 무μμ κ·Έλ κ² λ‘μ§μ μ§λ²λ¦¬λ©΄ νμ μ»΄ν¬λνΈ λ€μ΄ λ§μμ§μλ‘ μ΅μμ, μμ λ‘μ§μ΄ λΉλν΄μ§μ λ§μ μ μκ² λλ€.)
β
μ λ΅μ useImperativeHandle μ΄λ€. μμμ λ¬Έλ²μ΄λ λ³μλ₯Ό λΆλͺ¨ λ¨μμ μ¬μ©ν μ μκ² ν΄μ£Όλ λ¬Έλ².
β
μ°μ .. forwardRef λΆν°...
β
forwardRef μμ΄ μμμ ref λ₯Ό λΆλ¬μ€λ €κ³ μλλ₯Ό ν΄λ³΄μ.
import React, { useRef } from "react";
function Input({ ref }) {
return <input type="text" ref={ref} />;
}
function Field() {
const inputRef = useRef(null);
function handleFocus() {
inputRef.current.focus();
}
return (
<>
<Input ref={inputRef} />
<button onClick={handleFocus}>μ
λ ₯λ ν¬μ»€μ€</button>
</>
);
}
μ°λ¦¬κ° μ¬μ©νλ νν ref λ¬Έλ²μ΄λ€.
μ΄λ μλ§ μνλ λλ‘ μ μ μλμ΄ λμ§ μκ³ , μλμ κ°μ κ²½κ³ λ©μΈμ§κ° λ°μν κ²μ΄λ€.
Warning: Input: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop.
β
refλ propμ΄ μλκΈ° λλ¬Έμ undefineμΌλ‘ μ€μ λλ€λ κ²½κ³ λ©μΈμ§ μ΄λ€.
β
μ°λ¦¬κ° μνλ μμ μ»΄ν¬λνΈμμ νμ μ»΄ν¬λνΈμ ref λ₯Ό λΆλ¬μ€κΈ° μν΄μ νμν κ°λ μ΄ ForwardRef κ° λλ κ²μ΄λ€.
β
μλ₯Ό μ μ μλνλ μ½λλ‘ λ³κ²½ν΄λ³΄λ©΄ μλ μ²λΌ μ΄λ£¨μ΄μ§λ€.
import React, { forwardRef, useRef } from "react";
const Input = forwardRef((props, ref) => {
return <input type="text" ref={ref} />;
});
function Field() {
const inputRef = useRef(null);
function handleFocus() {
inputRef.current.focus();
}
return (
<>
<Input ref={inputRef} />
<button onClick={handleFocus}>μ
λ ₯λ ν¬μ»€μ€</button>
</>
);
}
μ¬μ©λ²
1. λΆλͺ¨ μ»΄ν¬λνΈμμ useRef() λ₯Ό import λ° μ μΈν΄μ£Όκ³ , μμ μ»΄ν¬λνΈλ‘ 보λΈλ€.
import React, { useRef } from "react";
import Input from "./child.js"
function Field() {
const inputRef = useRef(null);
function handleFocus() {
inputRef.current.focus();
}
return (
<>
<Input ref={inputRef} />
<button onClick={handleFocus}>μ
λ ₯λ ν¬μ»€μ€</button>
</>
);
}
2. μμ μ»΄ν¬λνΈμ μ 체λ₯Ό forwardRef() λ‘ κ°μΌλ€.
ννλ forwardRef((props,ref)=>{ }); μ΄λ©° () μ κ° ννλ κ³ μ μ΄λ€.
λ°λΌμ propsλ₯Ό λ°μμ¬λλ props.____ λ‘ λ°μμμΌ νλ€.
import {forwardRef} from "React"
export const Input = forwardRef((props, ref) => {
return <input type="text" ref={ref} />;
});
UseImperativeHandle?
λΆλͺ¨μμ μ μν ν¨μλ₯Ό μλλ‘ λ΄λ¦¬λ κ²μ νν μΌμ΄λ€.
νμ§λ§ μ½λ μμ μ΄μ λ‘ μΈνμ¬ μμμ ν¨μλ₯Ό λΆλͺ¨λ‘ 보λ΄λ €λ©΄?
react μμλ useImperativeHandle μ΄λΌλ κΈ°λ₯μ μ¬μ©ν΄μ£Όμ΄μΌ νλ€.
β
μ¬μ©λ²
1. forwardRef() κΉμ§ μ ν λ μνμμ λΆλͺ¨μμ μ¬μ©ν ν¨μλ₯Ό useImperativeHandle() λ‘ κ°μΈμ€λ€.
import "./styles.css";
import React, { forwardRef, useImperativeHandle, useRef }
from "react";
/* 1. νμν hook import νκΈ° */
const Input = forwardRef((props, ref) => {
/* 3. λ°μ λμμ€ ν΅νμ¬ λΆλͺ¨μκ² μ λ¬ν΄μ£Όκ³ μΆμ κ²λ€
λ°κ΅¬λμ μ§μ΄ λ£κΈ°*/
useImperativeHandle(ref, () => {
childfunction
});
const childfunction = () => {
console.log("I'm child function");
};
return <input type="text" ref={ref} />;
});
export default function App() {
const inputRef = useRef(null);
/* 4. λμμ€λ‘ μ λ¬ λ°μ λ°κ΅¬λ μ λ¬Όν μ¬μ©νκΈ° */
function handleFocus() {
inputRef.current.childfunction();
}
return (
<>
/* 2. μμ νΌμΌλ‘ λμμ€ λ΄λ €μ£ΌκΈ° */
<Input ref={inputRef} />
<button onClick={handleFocus}>μ
λ ₯λ ν¬μ»€μ€</button>
</>
);
}
μ΄λ° κΈ°λ₯μ ν΅νμ¬ μ μ ν κ³³μμ funcμ΄λ λ³μλ₯Ό μ μΈνκ³ κ΄λ¦¬ν΄μ£Όλ κ²μ΄ νμνλ©°,
μ΄λ° hookμ μ¬μ©νλ©΄ μλ°©ν₯ μν΅μ΄ μλ, λ¨λ°©ν₯ μν΅μΌλ‘ κ΄λ¦¬κ° κ°λ₯νκΈ° λλ¬Έμ μνμ°Έμ‘° λ¬Έμ λ₯Ό ν΄κ²°ν μ μκ² λλ€.!
β곡μ λ¬Έμλ₯Ό μ½κ±°λ κ°λ°νλ©° λκΌλ λνΌμ
λ‘ μμ±νκ³ μμΌλ,
κΆκΈνμ μ μ΄λ μλͺ»λ μ μ΄ μλ€λ©΄ λκΈ λ¨κ²¨μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.