본문 바로가기
Front-end/React

리액트 조건부 랜더링

by warrior.p 2022. 3. 31.

검색폼 구현하기 2

조건부 렌더링

  • 💡요구사항: 검색어를 입력하면 x 버튼이 보이고, 없으면 x 버튼을 숨긴다.

입력 요소에 무언가 입력하면 우측에 x 버튼을 추가한다. 반대로 입력한 문자를 삭제하면 버튼이 사라져야 한다. 조건에 따라 보이거나 숨겨야 하는 조건부 렌더링 기능을 사용해서 요구사항을 구현할 수 있겠다.

리액트에서 조건부 렌더링 하는 방식은 세 가지다.

  • 엘리먼트 변수를 사용하는 방식
  • 삼항 연산자를 사용하는 방식
  • && 연산자를 사용하는 방식

 

1. 엘리먼트 변수를 사용하는 방식

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

    this.state = {
      searchKeyword: '',
    };
  }

  handleChangeInput(event) {
    // this.state.searchKeyword = event.target.value;   X
    // this.forceUpdate();    X
    //컴포넌트 상태를 변경하려면 직접 수정하지 말고 컴포넌트class가 제공하는 set메소드를 사용해라!
    //컴포넌트의 상태를 변화시키겠다는 컴포넌트와의 직접적인 약속. 잊지말자 setState()
    const searchKeyword = event.target.value;
    this.setState({ searchKeyword });
  }

  render() {
    let resetButton = null;

    if (this.state.searchKeyword.length > 0) {
      resetButton = <button type='reset' className='btn-reset'></button>;
    }

    return (
      <>
        <header>
          <h2 className='container'>검색</h2>
        </header>
        <div className='container'>
          <form>
            <input
              type='text'
              placeholder='검색어를 입력하세요'
              autoFocus
              value={this.state.searchKeyword}
              onChange={event => this.handleChangeInput(event)}
            />
            {resetButton}
          </form>
        </div>
      </>
    );
  }
}

ReactDOM.render(<App />, document.querySelector('#app'));

 

2. 삼항연산자를 사용하는 방법

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

    this.state = {
      searchKeyword: '',
    };
  }

  handleChangeInput(event) {
    const searchKeyword = event.target.value;
    this.setState({ searchKeyword });
  }

  render() {
    // let resetButton = null;

    // if (this.state.searchKeyword.length > 0) {
    //   resetButton = <button type='reset' className='btn-reset'></button>;
    // }

    return (
      <>
        <header>
          <h2 className='container'>검색</h2>
        </header>
        <div className='container'>
          <form>
            <input
              type='text'
              placeholder='검색어를 입력하세요'
              autoFocus
              value={this.state.searchKeyword}
              onChange={event => this.handleChangeInput(event)}
            />
            {this.state.searchKeyword.length > 0 ? (
              <button type='reset' className='btn-reset'></button>
            ) : null}
          </form>
        </div>
      </>
    );
  }
}

ReactDOM.render(<App />, document.querySelector('#app'));

 

 

3. && 연산자를 사용하는 방식

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

    this.state = {
      searchKeyword: '',
    };
  }

  handleChangeInput(event) {
    const searchKeyword = event.target.value;
    this.setState({ searchKeyword });
  }

  render() {
    // let resetButton = null;

    // if (this.state.searchKeyword.length > 0) {
    //   resetButton = <button type='reset' className='btn-reset'></button>;
    // }

    return (
      <>
        <header>
          <h2 className='container'>검색</h2>
        </header>
        <div className='container'>
          <form>
            <input
              type='text'
              placeholder='검색어를 입력하세요'
              autoFocus
              value={this.state.searchKeyword}
              onChange={event => this.handleChangeInput(event)}
            />
            {this.state.searchKeyword.length > 0 && (
              <button type='reset' className='btn-reset'></button>
            )}
          </form>
        </div>
      </>
    );
  }
}

ReactDOM.render(<App />, document.querySelector('#app'));

'Front-end > React' 카테고리의 다른 글

상태 끌어올리기 (lifting state up)/폼 검증(form validation)  (0) 2022.04.07
함수 컴포넌트 사용해보기(헤더)  (0) 2022.04.06
REST Api  (0) 2022.03.24
setState()  (0) 2022.03.20
state/props  (0) 2022.03.20