[React]React DOM & UseRef

seunghyoยท2023๋…„ 4์›” 20์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
3/5
post-thumbnail

3์ฃผ ๋ธ”๋กœ๊น… ์ฑŒ๋ฆฐ์ง€~~๐Ÿ’ป โœ๏ธ

1_React-DOM๐Ÿ“•


๋ฆฌ์•กํŠธ์˜ ์ฃผ์š” ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ€์ƒ๋”์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. react-dom ํŒจํ‚ค์ง€๋Š” ์•ฑ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๋Š” CSS, HTML ๊ทธ๋ฆฌ๊ณ  ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ๋ณด๋ฉด ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ Babel์„ ํ†ตํ•ด ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค. HTML ๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•œ๋ฐ ๊ทธ ์ž‘์—…์„ React-Dom์ด ํ•˜๊ฒŒ๋œ๋‹ค.

๊ฐ€์ƒ๋”์ด๋ž€, ์‹ค์ œ DOM์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌํ•ด์ค€ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฐ€์ƒ๋”์— ๋ Œ๋”๋ง๋˜๊ณ  ์ด์ „์— ์ƒ๊ธด ๊ฐ€์ƒ๋”๊ณผ ๋น„๊ตํ•ด์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ ๋”์— ์ ์šฉ์‹œ์ผœ์ค€๋‹ค. ๋ฐ”๋€ ๋ถ€๋ถ„์„ ์ฐพ์•„์„œ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •์„ Diffing์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ๋ฐ”๋€ ๋ถ€๋ถ„์„ ์‹ค์ œ ๋”์— ์ ์šฉ์‹œ์ผœ ์ค€๋‹ค. ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ๋ณ€ํ•˜์˜€๋”๋ผ๋„ ํ•œ๋ฒˆ์— ๋ฌถ์–ด์„œ ์‹ค์ œ๋” ์ˆ˜์ •์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ด ์ ˆ์•ฝ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./app";

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById("root")
);

์œ„์ฒ˜๋Ÿผ ReactDOM.render()๋ฅผ ํ†ตํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.index.js์—์„œ ์ตœ์ƒ์œ„ root์— ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์šฐ๋ฆฌ๋Š” <App> ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ž‘์„ฑํ•˜์—ฌ App์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

2_useRef๐Ÿ“•


HTML์„ ์ž‘์„ฑํ•  ๋•Œ, div ๋“ฑ์˜ DOM ์š”์†Œ์— ์ด๋ฆ„์„ ๋‹ฌ ๊ฒฝ์šฐ <div id="my-id"> ์™€ ๊ฐ™์ด id๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠน์ •ํ•œ id์— ํ•ด๋‹นํ•˜๋Š” DOM ์š”์†Œ์—๋งŒ ์Šคํƒ€์ผ์„ ๋”ฐ๋กœ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•ด๋‹น DOM ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. HTML์„ ์ž‘์„ฑํ•  ๋•Œ ์ด๋ ‡๊ฒŒ id๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋ฆฌ์•กํŠธ์—์„œ๋„ DOM์„ ์„ ํƒํ•ด ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ref๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

const ์ฃผ์†Œ๊ฐ’์„_๋‹ด๋Š”_๊ทธ๋ฆ‡ = useRef(์ฐธ์กฐ์ž๋ฃŒํ˜•)
// ์ด์ œ ์ฃผ์†Œ๊ฐ’์„_๋‹ด๋Š”_๊ทธ๋ฆ‡ ๋ณ€์ˆ˜์— ์–ด๋–ค ์ฃผ์†Œ๊ฐ’์ด๋“  ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return (
  <div>
    <input ref={์ฃผ์†Œ๊ฐ’์„_๋‹ด๋Š”_๊ทธ๋ฆ‡} type="text" />
      {/* React์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ref๋ผ๋Š” ์†์„ฑ์— ์ฃผ์†Œ๊ฐ’์„_๋‹ด๋Š”_๊ทธ๋ฆ‡์„ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•˜๋ฉด*/}
      {/* ์ฃผ์†Œ๊ฐ’์„_๋‹ด๋Š”_๊ทธ๋ฆ‡ ๋ณ€์ˆ˜์—๋Š” input DOM ์—˜๋ฆฌ๋จผํŠธ์˜ ์ฃผ์†Œ๊ฐ€ ๋‹ด๊น๋‹ˆ๋‹ค. */}
      {/* ํ–ฅํ›„ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ input DOM ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. */}
  </div>);


function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
  inputEl.current.focus();
};
return (
  <>
    <input ref={inputEl} type="text" />
    <button onClick={onButtonClick}>Focus the input</button>
  </>);
}

ref๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ

  • focus
  • text selection
  • media playback
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ
  • d3.js, greensock ๋“ฑ DOM ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ

0๊ฐœ์˜ ๋Œ“๊ธ€