티스토리 뷰

React

useRef

이채야채 2021. 11. 29. 17:28

 

useRef 

 

  • Dom을 선택하는 용도로 사용
  • 컴포넌트 안에서 조회 및 수정할 수 있는 변수 관리

오늘은 usRef의 첫번째 특징 Dom선택용도에 대해 공부해보려한다.

렛츠고!

 

이전에 돔 시간에서

자바스크립트의 getElementById, querySelector 같은 DOM Selector 함수를 사용해서 DOM 을 선택했다.

리액트에서도 가끔 돔을 직접 선택해야하는 상황이 있다고한다

이럴때 사용하는게 useRef Hook함수

 

useRef로 DOM 노드, 엘리먼트, 그리고 리액트 컴포넌트 주소값을 참조한다

주소값은 컴포넌트가 re-render 되더라도 바뀌지 않는다.

 

 

조금 쉬운 코드를 만들어서 이해해보자 

import logo from './logo.svg';
import {useRef, useref} from 'react'


function App() {
  const myRef = useRef(null)

  return (
    <div>
    <button onClick = {()=> myRef.current.style.backgroundColor = 'pink'}>
      색변경
    </button>
    <div ref={myRef}>userRef 공부해보자</div> 
    </div>
  
    
  );
}

export default App;

작동원리 ? 콘솔로그

 

import logo from './logo.svg';
import {useRef, useref} from 'react'


function App() {
  const myRef = useRef(null)

  return (
    <div>
    <button onClick = {()=> {
      console.log(myRef); //콘솔로그를 집어넣어줌
      console.log(myRef.current) // myRef.current도 확인해보자
      myRef.current.style.backgroundColor = 'pink'}
      }>
      색변경
    </button>
    <div ref={myRef}>userRef 공부해보자</div> 
    </div>
  
    
  );
}

useRef를 사용하면 객체가 하나 뿅! 튀어나오는데

key값으로는 current를 가지고있다.

 

그렇다면 myRef.current를 찍어보니 myRef를 포함하고있는 <div></div>가 튀어나오면서 그값을 참고하여 버튼을 누를시에 

backgroundColor가 핑크로 변하는것이 보인다. 

 

 

이제 좀더 심화하여 알아보자

import {createRef, useRef, useState} from 'react'


function App() {
  const myRef = useRef(null)
  
  const [list,setList] = useState([
    {id :1 , name : '채영'},
    {id :2 , name : '민우'}
  ])
  const myRefs = Array.from({length:list.length}).map(()=>createRef());
  //myref가 배열로 만들어진다.

  return (
    <div>
    <button onClick = {()=> {
      console.log(myRef);
      console.log(myRef.current)
      myRef.current.style.backgroundColor = 'pink'
      myRefs[0].current.style.backgroundColor = 'powderblue'
    }
      }>
      색변경
    </button>
    <div ref={myRef}>userRef 공부해보자</div> 
    {list.map((user , index)=> (
        <h1 ref={myRefs[index]}>{user.name}</h1>))}
    </div>
  
    
  );
}

export default App;

 

 

 

 

 


 

학습 과정에서 나온 코드 예시

Action Item 1 : focus

타자연습을 하는 코드를 예시로 보여줬다.

 

import React, { useRef } from "react";

const Focus = () => {
  const firstRef = useRef(null);
  const secondRef = useRef(null);
  const thirdRef = useRef(null);

  const handleInput = (event) => {
    console.log(event.key, event);
    if (event.key === "Enter") {
      if (event.target === firstRef.current) {
        secondRef.current.focus();
        event.target.value = "";
      } else if (event.target === secondRef.current) {
        thirdRef.current.focus();
        event.target.value = "";
      } else if (event.target === thirdRef.current) {
        firstRef.current.focus();
        event.target.value = "";
      } else {
        return;
      }
    }
  };

  return (
    <div>
      <h1>타자연습</h1>
      <h3>각 단어를 바르게 입력하고 엔터를 누르세요.</h3>
      <div>
        <label>hello </label>
        <input ref={firstRef} onKeyUp={handleInput} />
      </div>
      <div>
        <label>world </label>
        <input ref={secondRef} onKeyUp={handleInput} />
      </div>
      <div>
        <label>codestates </label>
        <input ref={thirdRef} onKeyUp={handleInput} />
      </div>
    </div>
  );
};

export default Focus;

코드를 읽을때 우선은 화면과 비교하는 연습을 해야겠다.

1. 리턴부분을 보며 어디가 어딘지를 비교하기 -> ok

2. 이해가 안됬던것을 찾아보기 -> event.key와 event.target을 좀 찾아봤다.

(e => event.target.value는 자주했었는데 event.target만 나오니 음?? 생소하네 싶었다. 역시 대충알고 넘어가며안된다. 개념도 확실히하자)

 

  •  target 속성은 event가 전달한 객체에 대한 참조
  • event target의 value부분을 보는것이아니다. 그 타겟이 firstRef.current랑 같을때!

 

 

3. 코드보는것을 자꾸 두려워하지말고 천천히 시간을 들여서라도 한줄한줄 해석해봐야한다.

 

위에서 공부했던것과깉이 useRef를 변수에담아주면 객체가 튀어나올것이다 => 대략 {current : input}

if (event.target === firstRef.current) 이 코드가 그러면 키로 엔터를 눌렀고, 이벤트의 타겟이 첫번째인풋박스면 {뒤에 함수를 실행}한다

 

이렇게 해석이된다.

 

4. firstRef.current.focus() <= 이부분이 돔 선택을 한 부분이다 포커스 예시. 돔조작 -> useRef를 사용해서 포커스를 조정한다

 

Action Item 2 : media playback

import { useRef } from "react";

export default function App() {
  const videoRef = useRef(null);

  const playVideo = () => {
    videoRef.current.play();
    console.log(videoRef.current);
  };

  const pauseVideo = () => {
    videoRef.current.pause();
    videoRef.current.remove();
  };

  return (
    <div className="App">
      <div>
        <button onClick={playVideo}>Play</button>
        <button onClick={pauseVideo}>Pause</button>
      </div>
      <video ref={videoRef} width="320" height="240" controls>
        <source
          type="video/mp4"
          src="https://player.vimeo.com/external/544643152.sd.mp4?s=7dbf132a4774254dde51f4f9baabbd92f6941282&profile_id=165"
        />
      </video>
    </div>
  );
}

 

코드를 읽어보자.

 

1. <video> 삽입요소를 통하여 src값을 넣고 비디오를 삽입해줬다.

2. 그안에 useRef 변수를 담아주었다. console.log(videoRef) 를 하면 -> 객체가 튀어나올것이다 {current : video}
videoRef.current <- <video>가되고 이제 이부분을 조작할수있다.

 

3. 버튼을 온클릭하면 해당 버튼에 해당하는것 playVideo/pauseVideo가 실행된다.

4. playvideo함수는 비디오가 실행되게 해주는 함수

5. pausevideo함수는  중단한 후 없애버리는 함수

(다시 playvideo를 눌러봐도 비디오가 remove되어버려서 실행이 불가능했다.)

 


역시 차근차근 공부해야된다! 처음에는 뭔소리야 했지만

차근히 코드를 읽고 콘솔로그를 쳐보니 이해가됐다.

알아가는것에서 행복을 느껴보자 ! 매일매일 지식을 쌓고 똑똑...(?) 해진다..음..어제보다는 똑똑해지는게맞지 ㅋㅋㅋㅋ

아무튼 발전한다는것에 의의를두자.

나는 칭찬에 약하니 매일매일 내자신을 독려해주자 ! 오늘도 수고했다

'React' 카테고리의 다른 글

상태끌어올리기 2 : statesairline-client  (0) 2021.12.04
상태끌어올리기 : 함수를 내려주셈  (0) 2021.12.02
coin making  (0) 2021.11.28
todo list  (0) 2021.11.27
리액트 hook (useState와 useEffect)  (0) 2021.11.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함