[React] useRef์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ
728x90

๋ฆฌ์•กํŠธ ํ›… ์ค‘์˜ useRef ํ›…์€ DOM์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ฑฐ๋‚˜, ๊ฐ’์„ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ›…์ด๋‹ค.

(์ด๋•Œ ์ €์žฅํ•œ ๊ฐ’์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค!)

์•„์ง๊นŒ์ง€ useRef๋ฅผ input ํƒœ๊ทธ๋ฅผ ํฌ์ปค์‹ฑํ•  ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์—ˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ์˜ˆ์‹œ๊ฐ€ ๋” ์žˆ๋Š”์ง€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

ํฌ์ปค์‹ฑ ํ•˜๊ธฐ

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ input ์š”์†Œ ๋“ฑ์— ํฌ์ปค์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  {isLoggedIn && (
        <Icons>
          {showSearchInput && (
            <SearchInput
              inputRef={searchInputRef}
              setShowSearchInput={setShowSearchInput}
            />
          )}
          <SearchIcon onClick={() => setShowSearchInput(true)} />
        ...
        </Icons>
      )}

 

ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์™ธ๋ถ€์˜์—ญ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ๋ฅผ ํŒ๋‹จ์—์„œ ๊ฒ€์ƒ‰์ฐฝ์ด ๋‹ซํžˆ๋„๋ก ์‚ฌ์šฉํ•œ ์ ๋„ ์žˆ๋‹ค.

 // ๊ฒ€์ƒ‰์ฐฝ ์™ธ๋ถ€ ํด๋ฆญ ์—ฌ๋ถ€ ํŒ๋‹จ
  const clickOutside = (e: any) => {
    if (
      searchInputRef.current &&
      !searchInputRef.current.contains(e.target as Node)
    ) {
      setShowSearchInput(false);
    }
  };

 

 

๊ฐ’ ์ €์žฅํ•˜๊ธฐ

useRef์— ๊ฐ’์„ ์ €์žฅํ•ด์„œ ์ด์ „ ๊ฐ’, ํ˜„์žฌ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
.current ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

...
 const [count, setCount] = useState(0);
  const prevCountRef = useRef();
  useEffect(() => {
    prevCountRef.current = count;
  });
  const prevCount = prevCountRef.current;
  return (
    <>
      <h1>Now: {count}, before: {prevCount}</h1>
      <button onClick={() => setCount(count + 1)}>์นด์šดํŠธ ์ฆ๊ฐ€</button>
    </>
  );

 

 

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ

useRef์— ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค..!

useRefdใ…” ์ €์žฅ๋œ ๊ฐ’์€ ๋ฆฌ๋ Œ๋”๋ง์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ํšจ์œจ์ ์ผ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ.

 const mapContainerRef = useRef(null);
  const mapRef = useRef(null);

  useEffect(() => {
    mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';
    const map = new mapboxgl.Map({
      container: mapContainerRef.current,
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [0, 0],
      zoom: 2,
    });
    mapRef.current = map;
    return () => map.remove();
  }, []);

  return <div ref={mapContainerRef} style={{ height: '400px' }} />;

 

 

์ถœ์ฒ˜

https://itprogramming119.tistory.com/entry/React-useRef-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C

728x90