条件付きレンダリング


Reactは、パッケージングに必要なアクションの構成部品を作成します。これにより、アプリケーションのステータスに応じて、いくつかの構成部品しかレンダリングできません。


Reactでは、条件レンダリングはJavaScriptの条件処理と同じです.
function UserGreeting(props) {
  return <h1>Welcome back!!</h1>
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>
}
条件付きレンダリングされた構成部品の結果はPlease sign up.です.
function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if(isLoggedIn) <UserGreeting />
   
  return <GuestGreeting />
}
  
ReactDOM.render(
 <Greeting isLoggedIn={false} />,  
  document.getElementById('root')
)

要素変数


変数を使用して要素を格納できます.出力された他の部分は、変更せずに部分要素を条件付きでレンダリングすることができる.
function LoginButton(props) {
  return (
    <button onClick={props.onClick}>
      Login
    </button>
  )
}

function LogoutButton(props) {
  return (
    <button onClick={props.onClick}>
      LogOut
    </button>
  )
}
構成部品の例を条件付きで再レンダリングします.
class LoginControl extends React.Component {
 constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }
  
  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }
  
  render() {
    const isLoggedIn = this.state.isLoggedIn;
    let button;
    if (isLoggedIn) {
      button = <LogoutButton onClick={this.handleLogoutClick} />;
    } else {
      button = <LoginButton onClick={this.handleLoginClick} />;
    }

    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />
        {button}
      </div>
    );
  }
}

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

論理&&演算子ifをインラインとして表す


カッコには式を含めることができます.
function Mailbox(props) {
  const unreadMessages = props.unreadMessages;
  return (
    <div>
      <h1>Hello!</h1>
      {unreadMessages.length > 0 &&
        <h2>
          You have {unreadMessages.length} unread messages.
        </h2>
      }
    </div>
  );
}

const messages = ['React', 'Re: React', 'Re:Re: React'];
ReactDOM.render(
  <Mailbox unreadMessages={messages} />,
  document.getElementById('root')
);
&&以降の注記は、trueの条件で出力される.

条件演算子if-elseで行表現を構築する


  • render() {
      const isLoggedIn = this.state.isLoggedIn;
      return (
        <div>
          The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
        </div>
      );
    }

  • render() {
      const isLoggedIn = this.state.isLoggedIn;
      return (
        <div>
          {isLoggedIn
            ? <LogoutButton onClick={this.handleLogoutClick} />
            : <LoginButton onClick={this.handleLoginClick} />
          }
        </div>
      );
    }
    可読性は低下する可能性があるが、場合によっては条件が複雑な場合には素子を分離することができる.

    シンボルのレンダリングをブロックするには


    他のエレメントによってレンダリングされたときに、そのエレメント自体を非表示にする場合は、レンダリング結果を出力するのではなく、nullを返すことができます.
    function WarningBanner(props) {
      if (!props.warn) {
        return null;
      }
    
      return (
        <div className="warning">
          Warning!
        </div>
      );
    }
    
    class Page extends React.Component {
      //...
    }
    
    ReactDOM.render(
      <Page />,
      document.getElementById('root')
    );
    要素のrenderメソッドからnullを返すと、ライフサイクルメソッド呼び出しに影響しません.
    リファレンス
    このポスターは「実戦フィードバック」公式サイトhttps://ko.reactjs.org/で公開される.
    REACTチュートリアルhttps://ko.reactjs.org/docs/conditional-rendering.htmlを参照して作成します.