🪁react/react 실습

리액트 실행, useState, 리액트 검색폼 구현해보기,리액트 조건부 렌더링

하얀성 2024. 1. 2. 08:35

 

 


useState 사용이유

 

리액트는 mvc 패턴처럼 직접 연결 후 값을  수정하는게 아니라,

react의 메소드인 useState()를 사용해서 값을 수정하도록 해줘야 함(상태 갱신)

 

handleChangeInput(event) {
    // this.state.searchKeyword = event.target.value;
    // this.forceUpdate()

    this.setState({
      searchKeyword: event.target.value,
    })
  }

 

 

 

<설명>

리액트에서  input을 제대로 다루려면 브라우져 상태 관리를 리액트 안으로 가져와야 하는데 이 때 사용할 수 있는 것이 리액트 컴포넌트.

클래스로 제공하는 리액트 컴포넌트는 상태 관리를 위한 내부 변수 state를 가짐. 이 값을 input의 value로 지정 시, state가 변경될 때마다 input 엘리먼트가 반응함.

상태를 변경하는 방법은 Component 클래스의 setState() 메서드가 수행함. 메서드를 통해 상태를 관리해야 컴포넌트는 상태의 변화를 인지하게되고 무사히  UI도 변경 가능.


리액트 검색폼 구현 

 

리액트의 컴포넌트 객체를 상속받아서 사용.

App 객체에 render를 선언한 뒤에 

가상 리액트 돔에서 render 된 후에, 화면상에도 출력.

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

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

  handleChangeInput(event) {
    // this.state.searchKeyword = event.target.value;
    // this.forceUpdate()

    this.setState({
      searchKeyword: event.target.value,
    })
  }

  render() {
    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)}
            />
            <button type="reset" className="btn-reset"></button>
          </form>
        </div>
      </>
    );
  }
}

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

리액트 조건부 렌더링

 

1. 엘리먼트 변수 사용

2. 삼항 연산자 사용

3. && 연산자 사용

 

1. 엘리먼트 변수 사용

아.. onChange로 handleChangeInput 함수로 계속 searchKeywor값을 바꿔주면서 해주는데 resetButton라는 엘리먼트가 조건문을 계속 만족하게 함.

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)}
            />
            {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  && 연산자 사용(js에서는 앞의 조건이 거짓이면 뒷 내용은 실행안함)

jsx에서는 false값도 무시하기 때문에 아무것도 출력하지 않음.

 {this.state.searchKeyword.length > 0 && (
              <button type="reset" className="btn-reset"></button>
            ) }