0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【React】条件付きレンダー3つのパターン

Posted at

Reactではアプリケーションの状態に応じて、その一部だけを描画することが可能。
Reactにおける条件付きレンダーはJavaScriptにおける条件分岐と同じように動作する。

要素変数

要素を保持しておくために変数を使うことができる。
これは、出力の他の部分を変えずにコンポーネントの一部を条件付きでレンダーしたい時に役立つ。

ログアウトとログインボタンを表す以下のような2つの新しいコンポーネントを考える。

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

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

そして以下のLoginControlは現在のstateによって<LoginButton />もしくは <LogoutButton /> の一方をレンダーする。

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>
    );
  }
}

論理&&演算子によるインラインIf

中括弧で囲むことで、JSXに式を埋め込むことができる。これにはJavaScriptの論理&&演算子も含まれる。
これは条件に応じて要素を含めたい時に便利。

function Mailbox(props) {
  const unreadMessages = props.unreadMessages;
  return (
    <div>
      <h1>Hello!</h1>
      {unreadMessages.length > 0 &&
        <h2>
          You have {unreadMessages.length} unread messages.
        </h2>
      }
    </div>
  );
}

条件演算子によるインラインIf-Else

条件的に要素をレンダーするもう一つの方法はJavaScriptのcondition ? true : false条件演算子を利用すること。

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

より大きな式になると、可読性が下がる。条件が複雑になりすぎている場合は、コンポーネントの抽出のタイミングかもしれない。

コンポーネントのレンダーを防ぐ

時にコンポーネントを隠したいケースもある。その場合はレンダー出力の代わりに、nullを返すようにする。
コンポーネントの render メソッドから null を返してもコンポーネントのライフサイクルメソッドの発火には影響しない。

function WarningBanner(props) {
  if (!props.warn) {
    return null;
  }

  return (
    <div className="warning">
      Warning!
    </div>
  );
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?