본문으로 바로가기

조건부 렌더링

category React 2020. 11. 5. 15:53

조건부 렌더링

들어오는 입력에 맞게 다른 컴포넌트를 렌더링하는 코드다

function Greeting(props) {
    if(props.isLogged){
        return <UserGreeting/>;
    } else {
        return <GuestGreeting/>;
    }

}

function UserGreeting() {
    return <h1>
        Welcome Back!
    </h1>;
}

function GuestGreeting() {
    return <h1>
        Please, sign up.
    </h1>
}

ReactDOM.render(
    <Greeting isLogged={false}/>,
    document.getElementById('root')
);

Greeting을 렌더링하고 있으며 Greeting컴포넌트에서는 props로 받아온 값에 따라서

참이면 UserGreeting, 거짓이면 GuestGreeting 컴포넌트를 반환하고 있다

동적 변화

위 코드를 사용자의 버튼 클릭에 따라서 동적으로 바뀌는 페이지를 만들자

그렇게 하기 위해서는 isLogged의 값이 동적으로 바뀌어야하는데 순수 함수처럼 동작하는 props는 값을 바꿀 수 없다

우선 isLogged를 내부의 state로 옮겨야하는데 우리는 버튼도 추가해야 함으로 Greeting은 그대로 놔두고

컴포넌트를 하나 더 만들어서 합성 시켰다

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

        this.state = {
            isLogged: true
        }
    }

    render() {
        return (
            <div>
                <Greeting isLogged={this.state.isLogged}/>
            </div>
        );
    };
}

ReactDOM.render(
    <Change />,
    document.getElementById('root')
);

Greeting, UserGreeting, GuestGreeting 컴포넌트는 모두 동일하고 Greeting은 여전히 props를 받아 동작하지만

Greeting 외부의 Login컴포넌트의 state값을 받고 있기 때문에 우리는 이 값을 수정할 수 있다

이 과정에서 왜 컴포넌트를 작게 쪼개서 사용하는 것이 보수,재활용이 쉬운지 이해할 수 있었다

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

        this.state = {
            isLogged: true
        }
        this.handleChangeButton = this.handleChangeButton.bind(this);
    }

    render() {
        return (
            <div>
                <Greeting isLogged={this.state.isLogged}/>
                <button onClick={this.handleChangeButton}>Change</button>
            </div>
        );
    };

    handleChangeButton() {
        this.setState(state=>({
            isLogged : !state.isLogged
        }))
    }
}

버튼을 누르면 isLogged가 참이면 거짓, 거짓이면 참으로 바뀌고 그에 따라 동적으로 페이지가 바뀌게 되었다

여러가지 조건부

버튼도 참 거짓에따라 동적이게 바뀌게 만들어보자

if,else

render() {

    let button;
    if(this.state.isLogged){
        button = <button onClick={this.handleChangeButton}> log-out</button>
    } else button = <button onClick={this.handleChangeButton}> log-in</button>

    return (
        <div>
            <Greeting isLogged={this.state.isLogged}/>
            {button}
        </div>
    );
};

렌더 메소드안에서 조건문을 사용해서 button에 값에 맞는 엘리먼트를 할당하고

리턴하는 jsx안에서는 {}를 사용해 자바스크립트 문법으로 엘리먼트를 출력하는 코드이다

클릭에 따라 버튼도 같이 바뀌게 된다

논리 연산자

JSX안에는 if문은 사용하지 못하지만 논리연산자는 사용이 가능하다

아래의 코드들은 모두 위 if,else 코드와 결과가 동일하다

논리 연산자

render() {
    const isLogged = this.state.isLogged;

    return (
        <div>
            <Greeting isLogged={isLogged}/>
            {isLogged && <button onClick={this.handleChangeButton}> log-out</button>}
            {isLogged || <button onClick={this.handleChangeButton}> log-in</button>}
        </div>
    );
};

그냥 논리 연산자가 어떻게 작동하는지 보여주고 싶어서 쓴 코드

&&의 경우 앞의 조건이 참이면 뒤의 표현식이 출력 거짓이면 무시,
||의 경우 앞의 조건이 거짓이면 뒤의 표현식이 출력 참이면 무시

이 코드를 삼항 연산자로 표현하면 아래와 같다

삼항 연산자

render() {
    const isLogged = this.state.isLogged;

    return (
        <div>
            <Greeting isLogged={isLogged}/>
            {isLogged ? <button onClick={this.handleChangeButton}> log-out</button>
                      : <button onClick={this.handleChangeButton}> log-in</button>}
        </div>
    );
};

렌더링 막기

컴포넌트가 렌더링되는 것을 막으려면 null값을 반환하면 된다

사용했던 코드에서 로그아웃을 했을 때 Please, sign up.라는 멘트를 숨기고 싶다고 가정하면

function GuestGreeting() {
    return null
}

그냥 null을 반환시키면 된다

'React' 카테고리의 다른 글

controlled component  (0) 2020.11.13
list, key  (0) 2020.11.06
이벤트 처리하기  (0) 2020.11.04
lifecycle  (0) 2020.11.01
state  (0) 2020.10.31