Web/React

React Hook 03 - useRef()

또롱또 2022. 5. 16. 12:14
728x90

HTML에서 변화는 감지하지만, 그 변화가 렌더링을 발생시키지 않을때 사용 

 

1. 변수저장으로 사용된다

const ref = useRef(value) 이런식으로 선언하면
인자로 넣어준 value는
{current: value}로 저장이 된다.

그래서 이 객체의 값은 ref.current= value로 언제든 수정가능


state는 html에서 자꾸 변경되는 값에 쓰기 좋은데
ref는 렌더링이 안되기 때문에 변수들의 값을 유지할때 많이 쓴다.
**state에서 렌더링을 다시해도 ref의 값은 유지가 된다.

만약 내가 보여주지는않지만 상태가 바뀔때마다 상태를 저장하고싶은게 있는데, 

그걸 일반변수로 해버리면, 일반변수는 처음 초기값으로 돌아간다.

하지만 ref의 값은 안돌아간다.

 

import { useRef, useState } from "react";

const App = () => {
  const [count, setCount] = useState(0);
  const countRef = useRef(0);

  // 화면이 계속해서 rendering 되기 때문에 count 누를때마다 불린다.
  console.log("rendered");

  // 화면이 계속해서 rendering 되기 때문에 버튼이 눌릴때마다 숫자가 올라간다
  const IncrementState = () =>{
    setCount(count + 1);
  }

  // 화면이 계속해서 rendering 되지만 ref는 재rendering되지 않아서 숫자가 올라가지 않는다
  const IncrementRef = () =>{
    countRef.current = countRef.current + 1;
    // 하지만 value는 올라간다.
    console.log(countRef.current);
    // 즉 정리하자면, 화면에만 안보이지, 내부에 저장된 값은 변한다, 그러고 새로고침해서 화면이 아예 재 렌더링되면 화면에서 표시된다.
  }

  // 일반 변수로 선언하는거랑, ref로 선언하는거랑 차이
  // 일반 변수로 선언을 하면 레더링 될때마다 다시 처음에 준 값으로 돌아간다.
  let countVar = 0; 

  return (
    <div className="App">
      <p>State: {count} </p>
      <p>Ref: {countRef.current}</p>
      <button onClick={IncrementState}>IncrementState</button>
      <button onClick={IncrementRef}>IncrementRef</button>
    </div>
  );
}

export default App;

 

2. dom요소에 접근 가능

자바스크립트의 dom기능에 접근하듯이 접근이 가능하다.

import { useEffect, useRef, useState } from "react";

const App = () => {
  // submit 기본 제어 
  const onSubmit = (event) => {
    event.preventDefault();
    console.log("Submitted")
  }

  // 선언 useRef
  const inputRef = useRef();
  
  // 이게 쓰이는곳에는 맵이 로딩될때 한번만 focus 를 해준다
  useEffect(()=>{
    inputRef.current.focus();
  })

  return (
    <div className="App">
      <form action="/" onSubmit={onSubmit}>
        // 사용할땐 이렇게
        <input ref={inputRef} type="text" placeholder="username"/>
        <input type="submit" value="Log In"/>
      </form>

    </div>
  );
}

export default App;
728x90

'Web > React' 카테고리의 다른 글

React - Styled Components 02  (0) 2022.05.17
React - Styled Components 01  (0) 2022.05.16
React Hook 02 - useEffect()  (0) 2022.05.15
React Hook 01 - useState()  (0) 2022.05.15
React - 파일 만들때는 .jsx파일  (0) 2022.05.14