이번글에서는 React의 class 컴포넌트와 setState를 이용하여 state의 숫자가 1씩 증가하는 함수를 만들어 보자.

(리액트의 상태변화를 중점을 두어서 CSS는 별도로 올리지 않았다.)

 

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <App />
);

reportWebVitals();

 

<React.StrictMode>

create-react-app 을 실행하면 index.js에 strictmode 컴포넌트가 있는데 테스트 모드에서는 쓰이지만 배포모드에서 사용되지 않는다. 테스트를 하는데 필요 없어서 제거했다.

 

App.js

import React from 'react';
import Main from './components/page/Main';
import './app.css';

class App extends React.Component {
  render(){
    return (
      <div className="App">
        <Main />
      <div>
    )
  }
}

export default App;

 

Card.jsx

import React, { Component } from 'react'

export default class Card extends Component {
  constructor(props){
    super(props);
    this.state = {
   	   count: 0
    }
  }
  
  componentDidMount(){
    console.log('최초에 한번 나왔니?');
  }
  
  componentDidUpdate(){
    console.log('나 업데이트 됬어');
    console.log(this.state.count);
  }
  
  incrementCount = () => {
    this.setState({ ...this.state, count: this.state.count + 1 });
    console.log(this.state.count);
  }
  
  render(){
    return (
    	<div className='card'>
          <div className='title'>{this.props.title}</div>
          <div className='content'>
            <p>{this.props.text}</p>
            <p>{this.props.children}</p>
            <button onClick={this.incrementCount}>카운트 증가</button>
            <div>카운트 : {this.state.count}</div>
          </div>
        </div>
    )
  }
}

 

componentDidMount : 최초에 한번만 실행도는 함수

componentDidUpdate : 업데이트 될 때마다 실행할 함수

 

incrementCount 함수를 button에 onClick으로 할당하여 클릭시 state에 count 상태변수가 1씩 증가하도록 하였다.

클릭을 하면 카운트가 1씩 증가함을 확인할 수 있다. 

 

<setState>

state (상태) 관리는 직접 할당하지 않고 setState 함수를 통해서만 관리를 하는 것을 원칙으로 한다.

- 리액트는 state(상태)가 변경되면 리렌더링을 하기 때문에 state에 값을 할당하지 않는다.

- 상태 값은 마음대로 바꾸면 관리가 어렵다.

- 어디서 상태가 바뀌어야하는지 유추할 수 있어야한다.

 

Body.jsx

import React, { Component } from 'react';
import Card from './card/Card';

// export default 하나의 요소만 내보내겠다.

export default class Body extends Component {
  render(){
    return (
      <div id='body'>
      	{this.props.content.map((e) => <Card text={e.id} title={'첫번재 카드'}>나는 자식이야</Card>)}
      </div>
    )
  }
}

 

 

this.props.content.map((e) => <Card text={e.id} title={'첫번째 카드'}>나는 자식이야</Card>)

map으로 배열을 순회하며 Card 컴포넌트를 반환하는 함수를 만들어주었다.

 

Main.jsx

import React, { Component } from 'react';
import Body from '../Body';

export default class Main extends Component {
  render(){
    retur (
      <div>
        <Body content={[{ id: 1 }, { id: 2 }, { id: 3 }]} />
      </div>
    )
  }
}

 

결과

버튼 클릭을 하면 상태가 변하면서 count가 1씩 증가하는 것을 볼 수 있다.

+ Recent posts