Conditional Render
Conditional rendering
- //index.html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Document</title>
- </head>
- <body>
- <div id = "root"></div>
- <script src="https://fb.me/react-0.14.3.js"></script>
- <script src="https://fb.me/react-dom-0.14.3.js"></script>
- <script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
- <script src="script.js" type = "text/babel"></script>
- </body>
- </html>
-
- function UserGreeting(props) {
- return <h1>Welcome back!</h1>;
- }
-
- function GuestGreeting(props) {
- return <h1>Please sign up.</h1>;
- }
-
- function Greeting(props) {
- const isLoggedIn = props.isLoggedIn;
- if (isLoggedIn) {
- return <UserGreeting />;
- }
- return <GuestGreeting />;
- }
-
- ReactDOM.render(
- // Try changing to isLoggedIn={true}:
- <Greeting isLoggedIn={false} />,
- document.getElementById('root')
- );
-
-
Element Variables
- function UserGreeting(props) {
- return <h1>Welcome back!</h1>;
- }
-
- function GuestGreeting(props) {
- return <h1>Please sign up.</h1>;
- }
-
- function LoginButton(props) {
- return (
- <button onClick={props.onClick}>
- Login
- </button>
- );
- }
-
- function LogoutButton(props) {
- return (
- <button onClick={props.onClick}>
- Logout
- </button>
- );
- }
-
- function Greeting(props) {
- const isLoggedIn = props.isLoggedIn;
- if (isLoggedIn) {
- return <UserGreeting />;
- }
- return <GuestGreeting />;
- }
-
- 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')
- );
-
Inline If with Logical && Operator
It works because in JavaScript, true && expression always evaluates to expression
and false && expression always evaluates to false
- 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')
- );
-
- button = isLoggedIn ? (
- <LogoutButton onClick={this.handleLogoutClick} />
- ) : (
- <LoginButton onClick={this.handleLoginClick} />
- )
-
Preventing Component from Rendering
return null instead of its render output
- function WarningBanner(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(state => ({
- showWarning: !state.showWarning
- }));
- }
-
- render() {
- return (
- <div>
- <WarningBanner warn={this.state.showWarning} />
- <button onClick={this.handleToggleClick}>
- {this.state.showWarning ? 'Hide' : 'Show'}
- </button>
- </div>
- );
- }
- }
-
- ReactDOM.render(
- <Page />,
- document.getElementById('root')
- );
-
Reference