본문 바로가기
dev/React

[React18] 조건부 렌더링

by dev_Step 2023. 1. 21.

 

 -- Greeting 컴포넌트에 전달되는 props 값에 따라서 

   UserGreeting 또는 GuestGreeting 을 나타낸다.

function UserLogin(){
  return <h1> Hello, users </h1>
}

function GuestLogin(){
  return <h1> Hello, guest </h1>
}


function LoginCheck(props){
  const loginCheck = props.loginCheck;
  
  if(loginCheck){
    return <UserLogin />
  }else{
    return <GuestLogin />
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<LoginCheck loginCheck={false} />);

 

-- 엘리먼트 변수  

 >> 출력의 다른 부분은 변하지 않은 채로 컴포넌트의 일부를 조건부로 렌더링 가능

 >> button을 컴포넌트로 놓고 해당 컴포넌트를 loginCheck 값에 따라서 변경하여사용한다.

class LoginControl extends React.Component{
  constructor(props){
    super(props);
    this.loginComplete = this.loginComplete.bind(this);
    this.loginClear = this.loginClear.bind(this);
    this.state = { LoginCheck : false};
  }
  loginComplete(){
    this.setState({ LoginCheck : true});
  }
  loginClear(){
    this.setState({ LoginCheck : false});
  }
  render(){
    const loginCheck = this.state.LoginCheck;
    let button;
    if(loginCheck){
      button = <LogoutButton onClick={this.loginClear} />;
    }else{
       button = <LoginButton onClick={this.loginComplete} />;
    }
    return(
      <div>
        <Greeting loginCheck={loginCheck} />
        {button}
      </div>
    )
  }
}



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

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

function Greeting(props) {
  const loginCheck = props.loginCheck;
  if (loginCheck) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}


function LoginButton(props){
  return (
    <button onClick={props.onClick}>
      Login Button  
    </button>
  )
}

function LogoutButton(props){
  return (
    <button onClick={props.onClick}>
      Logout Button  
    </button>
  )
}





const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(<LoginControl />);

 

 

if를 사용하여 조건부로 렌더링 하는 방법은 좋은 방법이지만 짧은 구문을 사용하고 싶은경우

 -- 논리 && 연산자로 if를 인라인으로 표현할 수 있습니다.

 -- javacript에서 true && expression은 항상 expression으로 평가되고 false && expression은 항상 false로 평가됩니다.

 -- 따라서 && 뒤의 엘리먼트는 조건이 true일때 출력이 됩니다.

 -- 리액트의 경우는 false 표현식을 반환하면 여전히 && 뒤에 있는 표현식은 건너뛰지만 false 표현식이 반환된다.

즉 아래의 표현식에서는 <div>0</div>이 render 메서드에서 반환됩니다.

render(){
	const count = 0;
    return (
    	<div>
        	{count && <h1> Messages : {count} </h1> }
        </div>
    )
}

 다른 표현방법으로는  

-- 3항 연산자를 사용하여 나타낼수 있다.

render(){
	const loginCheck = this.state.LoginCheck;
    return(
    	<div>
			{ loginCheck 
            	? <LogoutButton onClick={this.loginClear} />
                : <LoginButton onClick={this.loginComlete} />
            }
		</div>
    )
}

 

 

컴포넌트가 렌더링하는 것을 막는 방법

 -- 가끔 다른 컴포넌트에 의해 렌더링될 때 컴포넌트 자체를 숨기고 싶을 떄가 있을수 있다.

이때는 렌더링 결과를 출력하는 대신 null을 반환하면 해결할 수 있다.

 -- 컴포넌트의 render 메서드로부터 null을 반환하는 것은 생명주기 메서드의 호출에 영향을 주지 않습니다.

 -- 따라서 componentDidUpdate는 계속 호출해줍니다.

function Banner(props){
  if(!props.warn){
    return null;
  }
  return(
    <div className="warning">
      Warning
    </div>
  )
}

class Page extends React.Component{
  constructor(props){
    super(props);
    this.state = {showWarning : true};
    this.handleToggleClick = this.handleToggleClick.bind(this);
  }
  
  handleToggleClick(){
    this.setState( (prevState) => ({
      showWarning : !prevState.showWarning
    }));
  }
  
  render(){ 
    return(
      <div>
        <Banner warn={this.state.showWarning} />
        <button onClick={this.handleToggleClick}>
          {this.state.showWarning ? 'Hide' : 'Show'}  
        </button>
      </div>
    );
  }
}


const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(<Page />);

'dev > React' 카테고리의 다른 글

[React18] React - Form  (0) 2023.01.22
[React18] 리스트와 Key  (0) 2023.01.21
[React18] setState()  (0) 2023.01.17
[React18] props  (0) 2023.01.11
[React18] 엘리먼트 렌더링  (0) 2022.12.11