State & Props

State

state는 화면에 보여줄 컴포넌트의 정보를 지니고 있는 객체이다.

 

state는 컴포넌트의 생성자(constructor) 내에서 this.state를 통해서 초기 상태 값을 설정해 줄 수 있다.

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

class Login extends React.Component {
    constructor() {
        super();

        this.state = {
            color: "blue",
        };
    }
    render() {
        return (
            <div className="Login">
                <section className="login_container">
                    <h1 className="title" style={{ color: this.state.color }}>
                        Westagram
                    </h1>
                    <form className="contents">
                        <div className="id_box input_box">
                            <input
                                className="input_id"
                                type="email"
                                placeholder="전화번호, 사용자 이름 또는 이메일"
                            />
                        </div>
                        <div className="pw_box input_box">
                            <input
                                className="input_pw"
                                type="password"
                                placeholder="비밀번호"
                            />
                            <button className="show_pw" type="button">
                                비밀번호 표시
                            </button>
                        </div>
                        <button className="submit_btn" type="submit">
                            로그인
                        </button>
                        <Child titleColor={this.state.color} />
                        <a href="https://en.wikipedia.org/wiki/Help:Reset_password">
                            비밀번호를 잊으셨나요?
                        </a>
                    </form>
                </section>
            </div>
        );
    }
}

위에서와 같이 this.state를 통해 객체 형식으로 초기값을 설정해 줄 수 있다. (객체의 key값은 원하는 대로 설정이 가능하다.)

설정한 초기값을 컴포넌트 내의 태그에서 속성 값으로 사용이 가능하다.

 

setState()

state의 값을 변경하기 위해서는 setState() 함수를 사용해야 한다.

import React from "react";
import "./Login.scss";

class Login extends React.Component {
    constructor() {
        super();

        this.state = {
            color: "blue",
        };
    }

    changeColor = () => {
    	this.setState({
            color: "red",
        })
    };
    render() {
        return (
            <div className="Login">
                <section className="login_container">
                    <h1 className="title" style={{color : this.state.color}} onClick={this.changeColor}>Westagram</h1>
                    <form className="contents">
                        <div className="id_box input_box">
                            <input
                                className="input_id"
                                type="email"
                                placeholder="전화번호, 사용자 이름 또는 이메일"
                            />
                        </div>
                        <div className="pw_box input_box">
                            <input
                                className="input_pw"
                                type="password"
                                placeholder="비밀번호"
                            />
                            <button className="show_pw" type="button">
                                비밀번호 표시
                            </button>
                        </div>
                        <button
                            className="submit_btn"
                            type="submit"
                        >
                            로그인
                        </button>
                        <a href="https://en.wikipedia.org/wiki/Help:Reset_password">
                            비밀번호를 잊으셨나요?
                        </a>
                    </form>
                </section>
            </div>
        );
    }
}

'title' 클래스명을 가진 h1태그에 onClick 이벤트를 설정하여 클릭 시 color의 값을 setState()를 활용해 변경해준다.

 

setState 참고

  1. setState의 두번째 매개변수로 setState의 실행이 완료되고 컴포넌트가 다시 렌더링 된 뒤에 실행될 콜백 함수를 전달할 수 있다. (리액트 공식문서에는 해당 방식으로 setState를 사용할 경우 componentDidUpdate()의 사용을 권장한다.)
  2. setState에는 객체뿐만 아니라 함수를 전달할 수도 있다.
  3. setState를 사용하지 않고 state의 값을 변경할 경우 컴포넌트를 다시 렌더링 하지 않는다. (setState를 사용해야 하는 가장 중요한 이유!!)
  4. setState는 컴포넌트를 항상 즉각적으로 갱신하지 않는다. 그렇기 때문에 setState 호출 후 바로 this.state에 접근할 경우 변경내용이 state에 적용되어있지 않을 수 있다. (이 경우 1번, 2번 방법의 사용을 권장한다.)

Props

props는 컴포넌트의 속성값으로 부모 컴포넌트로부터 전달받은 데이터를 지니고 있는 객체이다.

import React from "react";
import { withRouter } from "react-router-dom";
import Child from "../Child/Child";
import "./Login.scss";

class Login extends React.Component {
    constructor() {
        super();

        this.state = {
            color: "blue",
        };
    }

    changeColor = () => {
        this.state.color === "blue"
            ? this.setState({
                  color: "red",
              })
            : this.setState({
                  color: "blue",
              });
    };
    goMain = () => {
        console.log("this = ", this);
        this.props.history.push("/main");
    };
    render() {
        return (
            <div className="Login">
                <section className="login_container">
                    <h1 className="title">Westagram</h1>
                    <form className="contents">
                        <div className="id_box input_box">
                            <input
                                className="input_id"
                                type="email"
                                placeholder="전화번호, 사용자 이름 또는 이메일"
                            />
                        </div>
                        <div className="pw_box input_box">
                            <input
                                className="input_pw"
                                type="password"
                                placeholder="비밀번호"
                            />
                            <button className="show_pw" type="button">
                                비밀번호 표시
                            </button>
                        </div>
                        <button
                            onClick={this.goMain}
                            className="submit_btn"
                            type="submit"
                        >
                            로그인
                        </button>
                        <Child
                            changeColor={this.changeColor}
                            titleColor={this.state.color}
                        />
                        <a href="https://en.wikipedia.org/wiki/Help:Reset_password">
                            비밀번호를 잊으셨나요?
                        </a>
                    </form>
                </section>
            </div>
        );
    }
}

위의 코드에서는 Child 컴포넌트 내에 changeColor와 titleColor속성을 지정해 주었다. (속성의 이름은 마음대로 지정 가능)

import React from "react";

class Child extends React.Component {

    render() {
        return (
            <h1
                onClick={this.props.changeColor}
                style={{ color: this.props.titleColor }}
            >
                Hello world!!
            </h1>
        );
    }
}

export default Child;

Child 컴포넌트 내에서는 전달받은 속성 값을 props객체를 통해 접근할 수 있다.

'개발 > React' 카테고리의 다른 글

TIL #15 조건부 렌더링  (0) 2021.03.20
TIL #14 동적라우팅  (0) 2021.03.19
TIL #13 합성이벤트, key Prop  (0) 2021.03.10
TIL #10 react router  (0) 2021.03.03
TIL #9 React  (0) 2021.03.02

+ Recent posts