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