React

[React] useRef

주니야 공부하자 2024. 12. 11. 00:08

useState()의 경우 값이 바뀌게 되면 재랜더링 되며 화면이 변경되지만

useRef()는 값이 바뀌어도 재랜더링 되지 않기 때문에 화면이 변경되지 않습니다.

 

그럼 let으로 선언한 변수와 차이점이 없다고 생각할 수 있습니다.

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

  return (
    <div>
    </div>
  )
}

useRef()의 값은 재랜더링 되어도 변경되었던 값을 가지고 있지만 let으로 선언한 변수는 재랜더링 시 값이 초기화 됩니다.

 

let 변수를 컴포넌트 밖에 사용하면 변경한 값을 기억할 수 있습니다.

let counter = 0

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

  return (
    <div>
    </div>
  )
}

 

 

하지만 useRef()를 사용하면 컴포넌트 별로 값을 관리할 수 있다는 차이점이 있습니다.

 

결론, useRef()는 랜더링이 필요하지 않은 값을 저장할 때 사용됩니다.

ex) api로 받은 데이터를 현재 데이터와 비교할 때 등

const data = useRef(null)

useEffect(() => {
  data.current = { ...data }
}, [])

 

또는 DOM 요소를 조작할 때에도 사용할 수 있습니다.

const App = () => {
  const inputRef = useRef(null)
  
  useEffect(() => {
    inputRef.current.focus()
  }, [])

  return (
    <>
      <input ref={inputRef} type="text" />
    </>
  )
}

 

사용자가 만든 컴포넌트, 커스텀 컴포넌트를 참조하고 싶다면 해당 컴포넌트를 forwardRef를 사용하면 됩니다.

그리고 원하는 DOM 요소에 ref={ref} 속성을 지정해주면 됩니다.

const MyForm = forwardRef((props, ref) => {
  return (
    <form ref={ref}>
      <input type="text" />
    </form>
  )
})

const App = () => {
  const myFormRef = useRef(null)
  
  return(
    <div>
      <MyForm ref={myFormRef} />
    </div>
  )
}