React

[React] React state

ui-o 2023. 12. 18. 15:09
반응형

state

  • 컴포넌트 내부에서 바뀔수 있는 값
  • 클래스형 컴포넌트의 경우 state / 함수형 컴포넌트인경우 useState로 사용

클래스 컴포넌트의 state

state 초깃값 설정

// [기본문법]
  // state 초깃값 설정
  state = {
    속성: 값,
  	속성: 값
  };

// [constructor 메서드 사용한 문법]
 constructor(props) {
    super(props);
    // state 초깃값 설정
    this.state = {
		속성: 값,
  		속성: 값
    };
  }

constructor 메서드를 활용한 state

  • constructor 메서드를 작성하여 state 설정 - 객체 형식으로 작성
  • 반드시 super(props) 메서드를 호출하여 클래스 컴포넌트가 상속하고 있는 리액트 컴포넌트 클래스가 지닌 생성자 함수를 호출해 주어야함
  • this.state 를 통해 초깃값 설정현재
  • state 조회 : render함수 내에 this.state를 사용하여 조회
// [Count.js]
import {Component} from 'react'

class Count extends Component {
	constructor(props) {
		super(props)
		// state 초깃값 설정
	this.state = {
		number:0
	}
	}

	render(){
		const {number} = this.state  // state 조회
		return (
			<>
			<h1>{number}</h1>
			<button onClick ={()=>{this.setState({number:number+1})}} >increase</button>
			</>
		)
	}
}

export default Count

this.setState

  • this.setState를 사용하여 비동기적으로 state값을 업데이트 가능
// 함수를 인자로 가질 경우 기본 문법
this.setState((기존상태, 현재 지니고 있는  props) => { // props가 없을 경우 생략 가능
	return {
		// 업데이트 할 내용
	}
}
import { Component } from 'react';

class Count extends Component {
  state = {
    number: 0,
  };

  render() {
    const { number, name } = this.state; // state 조회
    return (
      <>
        <h1>{number}</h1>
        <button
          onClick={() => {
            this.setState((prev, props) => {
              return {
                // 업데이트 할 내용
                number: prev.number + 1,
              };
            });
          }}
        >
          increase
        </button>
      </>
    );
  }
}
export default Count;

this.setState 이후 callback 호출

  • setState 이후 특정 작업 실행을 원하는 경우 두번째 파라미터에 콜백함수를 등록하여 처리 가능
import { Component } from 'react';

class Count extends Component {
  state = {
    number: 0,
  };

  render() {
    const { number } = this.state; // state 조회
    return (
      <>
        <h1>{number}</h1>
        <button
          onClick={() => {
            this.setState(
              {
                number: number + 1,
              },
              // callback 함수 호출
              () => {
                console.log('callback');
              }
            );
          }}
        ></button>
      </>
    );
  }
}
export default Count;

exam source

import React from 'react';

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      num: 0,
    };
  }
  render() {
    return (
      <>
        <p>{this.state.num}</p>
				{/* setState : 상태 값을 업데이트 해주는 리액트 클래스 컴포넌트 메소드 */}
        <button type='button' onClick={() => this.setState({ num: this.state.num + 1 })}>
          Click
        </button>
      </>
    );
  }
}

export default Example;

함수형 컴포넌트의 state

  • v16.8 이하 경우 함수형 컴포넌트에 state 사용이 가능하였으나, v16.8이후부터 useState 함수를 사용
  • Hook 사용

1. 여러 State 변수 선언

  • 하나의 컴포넌트 내에 여러 개의 State Hook 사용 가능
  • 배열 구조 분해 문법은 useState로 호출된 state 변수들을 다른 변수로 할당할 수 있게 해주며, 
    이때 변수명은 useState API와 관련 없음
  • React는 매번 렌더링될 때 useState가 사용된 순서대로 실행
const [age, setAge] = useState(10)
const [name, setName] = useState('name')
const [list, setLiist] = useState([{text:'Hooks'}])

 


2. useState 사용

  • useState : 현재의 state값과 이 값을 업데이트 하는 함수를 쌍으로 제공하는 Hook 내장함수
  • 해당 함수를 이베트 핸들러나 다른 곳에서 호출 가능
  • 클래스의 this.setState와 거의 유사하나 이전 state와 새로운 state를 합치지  않는다는 차이점을 가짐
  • 초기값은 첫 번째 렌더링 시 딱 한번 사용 (컴포넌트가 렌더링 될 때 오직 한 번만 생성)
  • 클래스형 컴포넌트와 달리 초깃값은 객체일 필요 없으며, 숫자와 문자, 배열 등의 타입을 가질 수 있음
  • 각 각 다른 변수 저장을 위해서는 useState를 각각 호출해 줘야 함
  • 반환 : state변수와 해당 변수를 업데이트 할 수 있는 함수의 쌍을 반환

코드 형식

  • 함수명은 주로 set- 접두사를 붙여 명명
  • state값은 오로지 함수명을 통해 변경 가능
// 1.useState Hook을 react에서 가져옴
import {useState} from 'react';

// 2. useState 선언
const [state변수, state 변수를 업데이트 하는 함수명] = useState(초기값)

Exam Source

  • useState 사용
    import { useState } from 'react';
    
    const Example = () => {
      const [num, setNum] = useState(0);
    
      const onPlus = () => {
        setNum(num + 1);
      };
      return (
        <>
          <p>{num}</p>
          // 버튼 클릭 시 : setNum함수를 호출하여 state 변수를 갱신
          // React는 새로운 num 변수를 Example 컴포넌트에 넘기며 해당 컴포넌트를 리렌더링
          <button type='button' onClick={onPlus}>Plus</button>
        </>
      );
    };
    
    export default Example;
import { useState } from 'react';

const Color = () => {
  const [txt, setColor] = useState('black');

  return (
    <>
      <button style={{ color: txt }} onClick={() => setColor('blue')}>
        색 변경
      </button>
    </>
  );
};
export default Color;

state 갱신

// 클래스 컴포넌트는 state 갱신을 위해 this.setState() 호출
   <button type='button' onClick={() => this.setState({ num: this.state.num + 1 })}>
          Click
        </button>
 
 // 함수 컴포넌트에서는 state변수와 함수를 가지고 있으므로 this를 호출하지 않아도 됨
 <button onClick={() => setCount(num + 1)}>
    Click me
  </button>

유사한 요소를  하나의 useState로 관리

  • 구조 분해 할당 요소 사용
//  Set 구문
// * 개수는 항상 동일하게 맞춰줌
const [text, setTexts] = useState({
text01: '',
text02
})

// 구조 분해 할당을 이용하여 각 변수를 따로 관리
const {text01, text02} = text
//  Set 구문

State 사용 시 주의사항

  • state 값 변경 시 setState나 useState를 통해 전달받은 setter 함수를 사용해야 함
  • 배열이나 객체 업데이트 시 spread 연산자를 통해 사본을 만들어 값을 업데이트 하고 사본의 상태를 setState나 setter 함수를 통해 업데이트 진행
  • 상태 안에서 배열을 변형하는 경우 직접 배열에 접근하여 수정하지 않고, 배열 내장 함수(filter, spread, concat..)를 사용하여 새로운 배열 생성후 새로운 상태를 설정 해 주어야 함

 


 

 Sources

반응형

'React' 카테고리의 다른 글

[React] React Reference  (0) 2023.12.21
[React] React Event  (0) 2023.12.21
[React] 기본 코드 설명  (0) 2023.12.15
[React] React 기본 코드  (0) 2023.11.08
[React] React Props  (1) 2023.10.20