state

최지원·2020년 8월 4일
0

react에서 state는 컴포넌트 내부에서 바뀔 수 있는 값 을 의미한다. props는 컴포넌트가 사용되는 과정에서 부모 컴포넌트가 설정하는 값이다. 컴포넌트 자신은 해당 props를 읽기 전용 으로만 사용할 수 있다.
cf) 앞에서, Mycomponent.js 의 값을 변경하기 위해서는 App.js 부모 컴포넌트의 값을 변경해야했다. 반면, Mycomponent.js 에서는 전달받은 name 값을 직접 바꿀 수는 없었다.

반면, state 컴포넌트 내부에서 바뀔 수 있는 값 이다. React 에서는 두 종류의 state가 있다.

  1. 클래스형 컴포넌트의 state
  • Counter.js
import React, {Component} from 'react';

class Counter extends Component {
 constructor(props) {
  super(props);
   this.state = {
    number: 0 
    };
   }
   
 //컴포넌트 생성자 메서드이다.
 클래스형 컴포넌트에서 constructor를 작성할 때는 반드시 super(props)를 호출해야한다. 이 함수가 호출되면 현재 클래스형 컴포넌트가 상속받고 있는 리액트의 Component클래스가 지닌 생성자 함수를 호출해준다. 
 
 그 다음 this.state 값에 초기값을 설정한다. 컴포넌트의 state는 객체 형식이어야한다.

render() {
 const {number} = this.state;
 // state를 조회할 때는 this.state를 사용한다.
 return (
  <div>
   <h1> {number} </h1>
   <button 
   onClick = {() => 
        {this.setState({number: number + 1 });
    }}
    > 
    // onclick을 통해 버튼이 클릭되었을 때 호출할 함수를 지정한다. this.setState를 사용하여 state에 새로운 값을 넣을 수가 있다.
    +1
   </button>
  </div>
  
 );
 }
    
 
 

render() 함수 안에서 state를 조회할 때는 this.state를 조회하면 된다.

그리고 button 안에 onClick 이라는 값을 props 로 넣어주었는데 이는 버튼이 클릭될 때 호출시킬 함수를 설정할 수 있게 해준다. 이를 이벤트를 설정한다고 한다.
이벤트로 설정하는 함수는 화살표 함수를 사용한다. 함수 내부에서는 this.setState를 사용하여 state 값을 바꿀 수 있게 해준다.

state 객체 안에 여러 값이 존재할 경우

state 객체 안에는 여러 값이 존재할 수있다.

  • Counter.js
import React, {Component} form 'react';

class Counter extends Component {
 constuctor(props) {
  super(props);
  this.state = {
   number : 0,
   fixedNumber : 0
 };
}
render() {
 const { number, fixedNumber } = this.state;
 return (
  <div> 
   <h1> {number} </h1>
   <h2> 바뀌지 않는 값 {fixedNumber} </h2>
   
   <button onClick = {() => 
      {this.setState({ number : number + 1 });
      }}
   >  
     +1
   </button>
  </div>
  
   );
  }
 }
 
 export default Counter;
  
  

state 값 안에 fixedNumber라는 또 다른 값을 추가했다. 그리고 인자로 전달되는 개체 내부에 fixedNumber를 넣어 주지는 않았다. this.setState 함수는 인자로 전달된 객체 안에 들어있는 값만 바꾸어 주었다.

버튼이 클릭될 때, number 값만 변화하고 fixednumber 값은 변화하지 않는다.

0개의 댓글