리액트

[React] Hooks

코딩하는둥이 2023. 1. 5. 15:01

useState()

 : state를 사용하기 위한 Hooks

const[변수명, set함수명] = userState(초기값);
import React, {userState} from "react";

function Counter(props){
 const [count, setCount] = useState(0);
 
 return {
  <div> 
   <p> 홈 {count}번 클릭했습니다.</p>
   <button onClick={()=> setCount(count + 1)}>
     클릭
   </button>
  </div>
 };

}

useEffect()

 : side effect를 수행하기 위한  Hook

 - 다른 컴포넌트에 영향을 미칠 수 있으며, 렌더링 중에는 작업이 완료될 수 없기 때문이다.

 - 리액트의 함수 컴포넌트에서 Side effect를 실행할 수 있게 해주는 Hook

useEffect(이텍트 함수, 의존성 배열);

Effect function이 mount, unmount 시에 단 한 번씩만 실행된다.

useEffect(이텍트 함수, []);

의존성 배열을 생략하면 컴포넌트가 업데이트될 때마다 호출된다.

useEffect(이텍트 함수);

 

import React, {userState} from "react";

function Counter(props){
 const [count, setCount] = useState(0);
 
 // componrntDidMount, commponentDidupdate와 비슷하게 작동
 useEffect(()=> { 
    // 브라우저 API를 사용해서 document의 title을 업데이트
    document.title = 'you clicked ${count} times';
 });
 
 return {
  <div> 
   <p> 홈 {count}번 클릭했습니다.</p>
   <button onClick={()=> setCount(count + 1)}>
     클릭
   </button>
  </div>
 };

}

 

useMemo()

 - Memoized value를 리턴하는 Hook

 - 최적화를 위해 사용

 -  연산량이 많이 드는 함수를 호출 값을 저장해 두었다가 같은 입력값으로 함수를 호출하면 새로 함수 호출하지 않고 이전에 저장했던 함수 결과를 바로 반환 

const memolizedValue = useMemo(
  () = > {
    // 연산량이 높은 작업을 수행하여 결과를 반환
    return computeExpensiveValus(의존성 변수1, 의존성 변수2);
  },
  [의존성 변수1, 의존성 변수2]
);

의존성 배열을 넣지 않을 경우, 매 렌더링 마다함수가 실행됨

consr memoizedValue =useMemo(
 () = > computeExpensiveValue(a,b)
)

의존성 배열이 빈 배열일 경우, 컴포넌트 마운트 시에만 호출됨

const memoizedValue = useMemo(
  () => {
    return computeExpensivevalue(a,b);
  }
);

 

useCallback()

 -  useMemo() Hook과 유사하지만 값이 아닌 함수를 반환

const memoizedCallback = useCallback(
 () => {
   doSomething(의존성 변수1, 의존성 변수2);
 },
 [의존송 변수1, 의존성 변수2]
)

동일한 역할을 하는 두 줄의 코드 

useCallback(함수, 의존성 배열);

useMemo(() => 한수, 의존성 배열);
import { useState, useCallback} from "react";

function ParentComponent(props){
  const [ count, setCount] =  useState(0);
  
  //컴포넌트가 카룬트 될때만 함수가 정의됨
  const handleClick = useCallback((event) = > {
   // 클릭 이벤트 처리
  }, []);
  return(
  <div>
    <burron 
          onclick ={() => {
            setCount(count + 1);
          }}
     >
          {count}
     </button>
     
     <childComponent handleClick = {headleClick} />
  </div>
  );
}

 

useRef()

 -  REference를 사용하기 위한 Hook

 - 특정 컴포넌트에 접근할 수 있는 객체

   : refObject.current   // current -> 현재 참조하고 있는 Element

 - 내부의 데이터가 변경되었을 때 별도로 알리지 않는다.

function TextInputWithFocusButton(props){
  const inputElem = useRef(null);
  
  const onButtonClick = () -> {
    // current는 마운트된 input element을 가르킴
    inputRlrm.curent,focus();
  };
  
  return(
    <>
      <inpust ref = {inputElem} type ="text />
      <button onClick= {onButtonClick}>
       Focus the input
      </button>
      </input>
    </>
  );

}

다양한 변수를 저장할 수 있음

<div ref={myRef} />

 

Callack ref

 - 돔의 변화를 알 수 있다. 

 

function TextInputWithFocusButton(props){
  const [height, serHright] = useState(0);
  
  const measuredRef = useCallback(node -> {
    if ( node ! == null ) {
      setHeight(node.getBoundingClientRext().height);
    }
  }, []);
  
  return(
    <>
      <h1 ref = {mesuredRef}> 안녕 </h1>
      <h2>위 헤더의 높이는 {Marh.round(height)}px 입니다.</h2>
    </>
  );

}

 

 

규칙

1.  Hooks은 모조건 최상위 레벨에서만 호출해야 한다.

     - 반복문, 중첩문, 조건문 hook 사용 안됨

     : 컴포넌트가 렌더링 될 때마다 매번 같은 순서로 호출되어야 한다.

 

2. 리액트 함수 컴포넌트에서만 Hook을 호출해야 한다. 

      -  리액트 함수 컴포넌트에 호출

      - 직접 만든 컴스턴 훅에서만 호출

'리액트' 카테고리의 다른 글

[React] State 자세히 알아보기  (0) 2025.04.03
[React] CRA 없이 리액트 사용하기  (0) 2025.04.01
[React] Satae and Lifecycle  (1) 2023.01.05
[React] Component  (1) 2023.01.05
[React] Components and props  (1) 2023.01.05