kohigowild
Ref์ ํ์ฉ๊ณผ useRef ๋ณธ๋ฌธ
๐ก Ref
Ref๋ render ๋ฉ์๋์์ ์์ฑ๋ DOM ๋ ธ๋๋ React ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์๋ฅผ ๋ค์ด HTML์ ์์ฑํ ๋, div ๋ฑ์ DOM ์์์ ์ด๋ฆ์ ๋ฌ ๊ฒฝ์ฐ <div id = "my-id"> ์ ๊ฐ์ด id๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด์ฒ๋ผ React์์๋ DOM์ ์ ํํด ์ง์ ์ ๊ทผํ๊ธฐ ์ํด Ref๋ฅผ ์ฌ์ฉํ๋ค.
Ref๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
- ํฌ์ปค์ค, ํ ์คํธ ์ ํ์์ญ, ํน์ ๋ฏธ๋์ด์ ์ฌ์์ ๊ด๋ฆฌํ ๋
- ์ ๋๋ฉ์ด์ ์ ์ง์ ์ ์ผ๋ก ์คํ์ํฌ ๋
- ์๋ ํํฐ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React์ ๊ฐ์ด ์ฌ์ฉํ ๋
๐ก ๋น์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์ - Ref ํ์ฉ
import React, { useRef } from "react";
export default function UncontrolledForm() {
const inputRef = useRef();
console.log(inputRef);
function handleSubmit(e) {
e.preventDefault();
alert(inputRef.current.value);
}
return (
<form onSubmit={handleSubmit}>
<label>๋๋ค์: </label>
<input type="text" name="nickname" ref={inputRef} />
<input type="submit" value="์ ์ถ" />
</form>
);
}
๐ก Ref ์ฌํ
forwardRef๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ์ ref๋ฅผ ๋ค๋ฃจ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์์ ์ปดํฌ๋ํธ์ DOM ๋ ธ๋์ ์ ๊ทผํ๋ ๊ฒ์ ์ปดํฌ๋ํธ์ ์บก์ํ๋ฅผ ํ๊ดดํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง๋ ์๋๋ค.
const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));
// ์ด์ DOM ๋ฒํผ์ผ๋ก ref๋ฅผ ์์ ๋ฐ์ ์ ์์ต๋๋ค.
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
useRef๋ .current ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , useRef() hook์ผ๋ก ๋ง๋ ๋ณ์๋ ์ปดํฌ๋ํธ์ ์์ ์ฃผ๊ธฐ๋ฅผ ํตํด ์ ์ง๋์ง๋ง .current ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง ์๋๋ค. ์ฆ, DOM ๋
ธ๋์ useRef()๋ฅผ ํตํด ์์ฑํ ref๋ฅผ ๋ถ์ด๊ฑฐ๋ ๋ผ์ด๋ ์ปดํฌ๋ํธ๋ ์ธ์งํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
DOM ๋
ธ๋์ ref๊ฐ attachํ๊ฑฐ๋ detachํ ๋ ์ด๋ค ์ฝ๋๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด callback ref ๋ฐฉ๋ฒ์ ์ธ ์ ์๋ค. ref์ useRef๋ก ๋ฐํ๋ ๊ฐ์ ๋๊ธฐ๋ ๊ฒ ์๋๋ผ ํจ์๋ฅผ ๋๊ธฐ๋ ๊ฒ์ด๋ค.
import React, { useState, useCallback } from "react";
import Cat from "./components/Cat";
import "./styles.css";
export default function App() {
const [height, setHeight] = useState(0);
const callbackRef = useCallback((node) => {
if (node !== null) {
setHeight(node.getBoundingClientRect().height);
}
}, []);
return (
<div>
<h4> ๊ณ ์์ด๊ฐ ์ธ์์ ๊ตฌํ๋ค ๏ธ</h4>
<p> ๋ด ํค๋ : {height}px ์ด์ผ</p>
<div ref={callbackRef}>
<Cat />
</div>
</div>
);
}
๐ก Reference
https://ko.reactjs.org/docs/refs-and-the-dom.html#gatsby-focus-wrapper
https://leehwarang.github.io/2020/11/29/ref.html
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Debounce In UseEffect (0) | 2023.03.26 |
---|---|
๋ฆฌ์กํธ ์ด๋ฏธ์ง ์ต์ ํ ๋ฐ ์ฑ๋ฅ ๊ฐ์ (0) | 2023.03.26 |
[React] props์ state (0) | 2022.12.15 |
REACT ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ (Life Cycle) (0) | 2022.12.10 |
React :: COIN TRACKER (0) | 2022.11.29 |