개발공부/리액트 기초

[project_nemo] 함수형 컴포넌트 state관리

jennayeo 2021. 4. 11. 14:31

useState()

함수형 컴포넌트는 원래 state를 사용할 수 없다.

하지만 이젠 리액트 훅 중에 하나인 useState를 써서 관리 가능하다.

 

Nemo.js컴포넌트 생성

import React from 'react';

const Nemo = (props) => {

	return null;
 }
 
 export default Nemo;

App.js

import후 반환에 <Nemo/>만 불러와준다.

 

Nemo.js

 스테이트 만들기

 

이제 뷰를 만든다.

 

app.js 전체코드

import React from "react";
import Nemo from "./Nemo";


class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      count: 3,
    };
  }

  addNemo = () => {
    // 스테이트 고치기(중괄호 안에 수정하고싶은 state값 넣어줌)
    this.setState({count: this.state.count + 1});
    // 지금있는 state값에서 +1
  }

  removeNemo = () => {
    if(this.state.count > 0){
      this.setState({ count: this.state.count - 1 });
    } else {
      window.alert('더이상 네모가 없습니다!');
    }
    this.setState({count: this.state.count - 1});
  }

  render() {
    // 어떤수의 길이만큼 배열을 반환해주는 배열의 내장함수 사용
    const nemo_count = Array.from({ length: this.state.count }, (v, i) => i);
    console.log(nemo_count);
    return (
      <div className="App">
        <Nemo/>
        
      </div>
    );
  }
}
export default App;

Nemo.js 전체코드

import React from 'react';

const Nemo = (props) => {
    const [count, setCount] = React.useState(3);
    // 대괄호 첫번째는 state로 쓸 변수명
    // 두번째는 count라는 값을 바꿔줄 함수
    // useState 괄호안에는 초기값이 들어감
    console.log('in nemo')
    console.log(count);

    // 추가, 빼기 버튼 함수
    const addNemo = () => {
        setCount(count+1); 
    }
    const removeNemo = () => {
        // 삼항연산자
        setCount(count > 0? count-1:0);
    }

    const nemo_count = Array.from({length: count}, (v, i) => (i));
    return (
        <div className="App">
        {/* count:3으로 state지정 후 뷰 만들기 */}
        {nemo_count.map((num, idx) => {
          return (
            // 리액트 요소 반환
            <div
              key = {idx}
              style={{
                width: "150px",
                height: "150px",
                backgroundColor: "#eee",
                margin: "10px",
              }}
            >
              nemo
            </div>
          );
        })}
        <button onClick={addNemo}>
          하나 추가
        </button>
        <button onClick={removeNemo}>
          하나 빼기
        </button>
      </div>
    );
  }


export default Nemo;