-- 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 |