[리액트(React) Study Log] [Person App-008] Understanding & Using State

 

1. State 개요

 - Props는 부모로부터 전달받는 attribute 인데, 어떤 속성을 Props 처럼 outside 로부터 전달받아야 하는 경우도 있지만, component inside 에 직접 가지고 있는 것이 더 유용한 경우가 있는데 이럴 때 사용하는 게 State .

 - State component 자신이 가지고 있는 상태 정보.

 - State class-based component 에서만 사용 가능.

 - react 의 기본 Component State, Life-cycle, PropTypes 등의 속성을 가지고 있으며, 따라서 extends Component 구문으로 만들어지는 class-based component 에서만 위의 3가지 속성을 사용할 수 있음. 위의 3가지 속성이 필요한 경우에만 class-based component 로 만들고, 필요없는 경우에는 일단 functional component 로 만들고, 3가지 속성이 경우필요해질 때 class-based component 로 변경해서 사용하면 됨. (state 관리 등이 필요없는 functional component app management 측면에서 편리하기 때문)

 - functional component 에서는 State 는 사용할 수 없고, Props만 사용 가능. class-based component 에서는 State Props 모두 사용 가능.

 - state javascript object 형태로 정의.

 - component 내에서 자신의 state 에 접근할 때는 this.state.<state key name> 으로 접근.

(this state 를 가지고 있는 compoennt 자신을 의미함.

 - component state(상태) changed 되면 해당 component 내의 render method 가 작동해서 re-rendering 된다. , 상태 변화가 일어날 때마다 변화된 상태가 즉시 브라우져에 반영됨.

, 이때 하위의 자식 component 까지 모두 re-rendering 이 일어나기 때문에 불필요한 cost 가 들어가서 성능 저하가 야기될 수 있음. --> 이러한 성능 저하 이슈는 class-based component 에서 사용 가능한 Life-Cycle method 에 의해 해결이 가능함. (ex : state 조건에 따라서 자식 component 의 불필요한 re-rendering 막기 등, 추후 자세히 다룰 예정.)

 

2. App.js state 만들기

 - object 형태로 state 를 정의하고 JSX 내에서 this.state.xxx 형태로 사용함.

 - 아래 app 은 결국 부모 component state 를 자식 component props 로 전달해서 브라우져에 rendering 되는 구조임.

// src-App.js

 

import React, { Component } from 'react';

import './App.css';

import Person from './Person/Person';

 

class App extends Component {

  state = {

    persons: [

      { name: 'David', age: 28 },

      { name: 'Lina', age: 29 },

      { name: 'Nick', age: 26 }

    ]

  }

 

  render() {

    return (

      <div className="App">

        <h1>Hi, I'm React App</h1>

        <p>This is really working!</p>

        <button>Switch Name</button>

        <Person name={this.state.persons[0].name} age={this.state.persons[0].age} />

        <Person name={this.state.persons[1].name} age={this.state.persons[1].age}>Nice to meet you.</Person>

        <Person name={this.state.persons[2].name} age={this.state.persons[2].age} />

      </div>

    );

  }

}

 

export default App;

 

 

3. 브라우져 확인


+ Recent posts