리액트에서의 State
- 모든 컴포넌트들은 State를 가질 수 있다.
 - 현재 State에 따라 렌더링 결과를 다르게 할 수 있다.
 - State의 변화에 따라 렌더링을 다시 하는것을 
Re-Rendering이라고 한다. - 리액트는 변수의 값의 변화로는 리렌더링 되지 않고(버퍼에 담김), State가 변화해야만 즉각적으로 리렌더링을 수행한다.
 - “react” 에서 useState를 import 하는것으로 State를 갖게 할 수 있다.
- 이때, “react”에는 useState만 있는것이 아니므로 다음과 같이 코드를 작성해야 한다
 import { useState } from "react";
 - state의 구성요소
- state는 배열, useState() 함수를 통해 얻을 수 있다.
 - state가 처음 생성됐을 땐 
[ undefined, f ]라는 값을 갖는다- undefined : state가 처음 생성됐을 때의 값, useState() 함수에 매개변수를 넣으면 그 값이 이 값이 된다.
 - f : state의 상태를 변화시키는 “상태변화 함수”(setter). 값을 인자로 받은 값으로 변화시킨다.
- 해당 함수는 
비동기로 동작하기에, State값을 내부적으로 사용할 땐 useEffect를 사용하는 것이 좋다. 
 - 해당 함수는 
 - 그러므로 구조분해 할당을 통해 state 변수와 setState 함수를 따로 받는것이 좋다.
 
 
 - state 변수는 const 로 정의해도 setState를 사용하면 변경이 가능하다. → 그러므로 state 변수는 const로 정의하고, setState로만 변경하는 것이 좋다.
 - 부모로부터 받는 props의 값이 바뀌면 자식 컴포넌트는 리렌더링된다.
 
이를 통해 React에서는 꼭 필요한 부분에만 리렌더링을 수행한다.
리액트에서 리렌더링이 발생하는 경우
React는 성능 최적화를 위해 여러 개의 setState 호출을 일괄 처리(batch) 한다.
즉, setState를 호출하면 그 즉시 state가 변하는 게 아니라, React가 다음 렌더링 사이클에 반영하도록 예약한다.
따라서, 화면의 렌더링과 상태의 변경은 별개이므로, 이 "리렌더링이 발생하는 경우"를 반드시 알고 있어야 한다.
- 상태(State) 변경
 - Props 변경
 - 부모 컴포넌트가 렌더링될때
 - Context를 사용하여 전역적인 변수가 변경되었을 때
 - 강제업데이트 (
forceUpdate()) 
중요하니 꼭 외워두자!
jsx에서 특정 태그에 접근하는 방법 → ref
- 태그 안에 
ref속성 사용하기! ref = {refPoint}- 이 속성을 이용해 해당 태그 주소 받아오면 다양한 메소드를 사용할 수 있다.
 
그런데, 이러한 "역참조"는 코드의 일관성을 깨뜨리므로, 어쩔 수 없는 상황에만 사용하도록 하자.
되도록이면 state로 UI를 제어하고, 정말 어쩔 수 없는 경우에만 ref를 사용하자.
코드의 흐름을 복잡하게 만들면, 이후에 읽게 될 코드를 예측하기 어렵게 만든다.
Reference 객체
- useRef() 함수로 Reference 객체를 생성한다.
 - useState() 함수와 굉장히 유사하나, 리렌더링을 시키는 state 값과는 달리 어떠한 경우에도 리렌더링을 시키지 않는다.
 - 또한, 호출된 “해당 컴포넌트 인스턴스”만 사용할 수 있는 상수로써 값을 유지한 함수로 사용할 수 있게 한다.
 - 그대신, 컴포넌트가 렌더링하는 특정 DOM에 접근하여 렌더링하지 않는 다양한 조작이 가능해진다.
- 특정 값을 강조하거나
 - 해당 DOM의 CSS값을 변경하거나 하는 등
 
 
예시 소스코드
// 1. 이름
// 2. 생년월일
// 3. 국적
// 4. 자기소개
import { useState, useRef } from "react";
function Register() {
  const [input, setInput] = useState({
    name: "",
    birth: "",
    country: "",
    bio: "",
  });
  function onChangeInput(e) {
    setInput({
      ...input,
      [e.target.name]: e.target.value,
    });
    console.log(e.target.name, e.target.value, input[e.target.name]);
  }
  const inputRef = useRef();
  function onSubmit(e) {
    if (input.name === "") {
      inputRef.current.focus();
    }
  }
  return (
    <>
      <div>
        <input
          ref={inputRef}
          type="text"
          name="name"
          onChange={onChangeInput}
        />
      </div>
      <div>
        <input
          type="date"
          name="birth"
          onChange={onChangeInput}
        />
      </div>
      <div>
        <select
          name="Country"
          id=""
          onChange={onChangeInput}>
          <option value="선택">---선택---</option>
          <option value="kr">한국</option>
          <option value="us">미국</option>
          <option value="uk">영국</option>
        </select>
      </div>
      <div>
        <textarea
          name="bio"
          cols="30"
          rows="10"
          onChange={onChangeInput}></textarea>
      </div>
      <button onClick={onSubmit}>submit</button>
    </>
  );
}
export default Register;
- Ref 값에 접근 → 
refObj.current 
리액트 훅
- 상태와 생명주기 메서드를 사용할 수 있게 해주는 기능.
 - useState, useRef 모두 React Hooks!
 - use 라는 접두사가 붙은 함수들은 모두 리액트 Hooks
 - 호출 제약
- 오직 함수 컴포넌트 & 커스텀 훅내부에서만 호출할 수 있으며
 - 조건문, 반복문 내부에서는 호출이 불가능함. → 서로 다른 훅들의 호출 순서가 엉망이 될 가능성
 
 - use라는 접두사를 이용하여 나만의 Hook도 제작 가능.
- 나만의 훅을 기존 훅들의 조합으로 생성 가능!
 - 중복되는 리액트 훅 코드들과 복잡한 알고리즘 과정들을 간단하게 중복 코드 제거!
 
 - 커스텀 훅 예시
 
import { useState } from "react";
function useInput(params) {
  const [input, setInput] = useState(params);
  function onChange(e) {
    setInput(e.target.value);
    console.log(input);
  }
  return [input, onChange];
}
export default useInput;
- 커스텀 훅은 일반적으로 src폴더의 hooks 디렉토리 안에 모아둔다.
 
'WEB FE Repository > React' 카테고리의 다른 글
| useReducer (0) | 2025.09.19 | 
|---|---|
| 리액트 컴포넌트의 라이프사이클과 useEffect (0) | 2025.09.19 | 
| 컴포넌트, jsx, 이벤트와 이벤트 객체 - 리액트의 기초 기능 사용 방법 (0) | 2025.09.19 | 
| 리액트 소개 (0) | 2025.09.19 |