FE코크
탄산 가득 시원한 개발일지
FE코크
전체 방문자
오늘
어제
  • 분류 전체보기 (43)
    • 우아한테크코스 (22)
      • 우아한테크코스4기 (4)
      • 우아한테크코스3 (10)
      • 회고록 (8)
    • Web (0)
      • HTTP 웹 기본지식 (0)
    • JavaScript (2)
    • React.js (12)
    • 알고리즘 풀이 (2)
    • HTML, CSS (4)
    • 기타 (1)
      • 일상 (0)
      • 후기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • createRoot
  • 개발자
  • 우테코
  • JavaScript
  • react
  • 프론트엔드
  • 코어자바스크립트
  • 회고
  • react.js
  • 우아한테크코스
  • 우아한테크코스 3기
  • 백준
  • 자바스크립트
  • CSS
  • 재택하고싶은데
  • Props
  • state
  • Reactjs
  • 노마드코더
  • jsx
  • 우테코4기
  • 레벨1회고
  • 주간회고
  • React.DOM
  • 4기
  • prop drilling
  • 리액트
  • 프리코스
  • 알고리즘
  • 회고록

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
FE코크

탄산 가득 시원한 개발일지

[ReactJS]노마드코더 리액트 기초-04. State
React.js

[ReactJS]노마드코더 리액트 기초-04. State

2021. 1. 21. 15:16

노마드코더-"ReactJS로 영화 웹 서비스 만들기"강의를 수강하며 공부한 내용입니다.

state

  • React.js에서는 유동적인 데이터를 사용하기 위해 state 객체를 사용한다.
  • props는 매개변수처럼 컴포넌트에 전달되지만 state는 컴포넌트 내에서 관리된다.
  • props와 다르게 state 값을 변경할 때는 직접 조작해서는 안되며 setState 메서드를 사용해야 한다. setState 메서드를 사용하는 이유는 React는 state가 변경될 때마다 변경된 부분을 감지하여 리렌더링 하기 때문에 직접 state를 조작하면 React는 변경된 부분을 감지하지 못한다.

state를 사용하여 버튼을 누르면 카운트 되는 예제

import React from "react";

class App extends React.Component {
  state = {
    count: 0,
  };
  add = () => {
    this.setState((now) => ({ count: now.count + 1 }));
  };
  minus = () => {
    this.setState((now) => ({ count: now.count - 1 }));
  };
  render() {
    return (
      <div>
        <h1>The number count: {this.state.count}</h1>
        <button onClick={this.add}>Add</button>
        <button onClick={this.minus}>minus</button>
      </div>
    );
  }
}

export default App;

setState(updater, [callback])

위에 소스코드를 보면 state를 조작하기 위해서 setState메서드를 사용하는 것을 볼수 있다. setState메서드는 컴포넌트 state의 변경 사항을 대기열에 집어넣고, React에게 해당 컴포넌트와 그 자식들이 갱신된 state를 사용하여 다시 렌더링되어야 한다고 알리는 메서드이다.

ko.reactjs.org/docs/react-component.html#setstate

 

React.Component – React

A JavaScript library for building user interfaces

ko.reactjs.org

"TypeError Cannot read property 'setState' of undefined"

위에 소스 코드에서

  add = () => {
    this.setState((now) => ({ count: now.count + 1 }));
  };

add property를 그냥 메서드로 쓰면 안되나? 라는 생각에 이렇게 고쳐서 소스 코드를 작성 했더니 "TypeError Cannot read property 'setState' of undefined" 에러가 나타났다. 이 에러가 왜 생겼는지에 대한 호기심에 알아 봤다.

//Error
add () {
    this.setState((now) => ({ count: now.count + 1 }));
  };

TypeError ...'setState'...

호출하는 함수가 bind 되지 않아서 에러가 발생한 것이다.

해결방법

 

1. 생성자에서 바인딩 해주기

<button onClick={this.add.bind(this)}>Add</button>

전체 소스코드

class App extends React.Component {
  state = {
    count: 0,
  };
  add() {
    this.setState((now) => ({ count: now.count + 1 }));
  }
  minus = () => {
    this.setState((now) => ({ count: now.count - 1 }));
  };
  render() {
    return (
      <div>
        <h1>The number count: {this.state.count}</h1>
        <button onClick={this.add.bind(this)}>Add</button>
        <button onClick={this.minus}>minus</button>
      </div>
    );
  }
}

 

2. 화살표 함수로 구현하기

  add = () => {
    this.setState((now) => ({ count: now.count + 1 }));
  };

화살표 함수는 자동으로 바인딩을 해주기 때문에 명시적으로 바인딩을 해주지 않아도 된다.

 

참고

devlog.jwgo.kr/2018/08/20/set-state-undefined-error-in-react/

 

리액트에서 "TypeError Cannot read property 'setState' of undefined" 가 발생할 때 · Tonic

사이트 운영에 도움을 주실 수 있습니다. 고맙습니다. --> 리액트에서 "TypeError Cannot read property 'setState' of undefined" 가 발생할 때 2018년 08월 20일 문제 this.setState 함수를 쓰는 도중 갑자기 “TypeError:

devlog.jwgo.kr

ko.reactjs.org/docs/react-component.html#setstate

 

React.Component – React

A JavaScript library for building user interfaces

ko.reactjs.org

poiemaweb.com/es6-arrow-function

 

Arrow function | PoiemaWeb

Arrow function(화살표 함수)은 function 키워드 대신 화살표(=>)를 사용하여 간략한 방법으로 함수를 선언할 수 있다. 하지만 모든 경우 사용할 수 있는 것은 아니다. 문법은 아래와 같다.

poiemaweb.com

 

'React.js' 카테고리의 다른 글

[React] ReactDOM.createRoot는 뭘까?  (0) 2022.04.26
[ReactJS]리액트 react-router-dom / HashRouter, BrowserRouter, Route, Switch, Link  (0) 2021.02.10
[ReactJS]노마드코더 리액트 기초-03. JSX & PROPS  (0) 2021.01.19
[ReactJS]노마드코더 리액트 기초-02.리액트 Set up  (0) 2021.01.19
[ReactJS]노마드코더 리액트 기초-01.리액트란?  (0) 2021.01.14
    'React.js' 카테고리의 다른 글
    • [React] ReactDOM.createRoot는 뭘까?
    • [ReactJS]리액트 react-router-dom / HashRouter, BrowserRouter, Route, Switch, Link
    • [ReactJS]노마드코더 리액트 기초-03. JSX & PROPS
    • [ReactJS]노마드코더 리액트 기초-02.리액트 Set up
    FE코크
    FE코크
    공부한 내용을 적는 블로그

    티스토리툴바