React中的条件渲染可以基于JavaScript运算符if或者条件运算符去创建元素来表现当前的状态,然后让React根据不同的条件来更新UI。
如下有两个针对不同条件而设置的组件:
function UserGreeting(props) { return <h1>欢迎主子光临~</h1>; } function GuestGreeting(props) { return <h1>请先去注册或登录!</h1>; }
再创建一个Greeting组件,它会根据用户是否登录来决定显示上面哪个组件:
function Greeting(props) { const isLoggedIn = props.isLoggedIn; if (isLoggedIn) { return <UserGreeting />; } return <GuestGreeting />; } ReactDOM.render( // 这里是用false测试,也可更改成true试试 <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> ); }
如下所示,再创建一个名为LoginControl
的类组件,这个类组件会用到状态(state),将登录状态存储在state中,即可根据当前state中代表登录状态的值来选择<LoginButton />
或<LogoutButton />
来渲染。同时它还会根据登录状态来渲染上一个示例中的<Greeting />
。
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') );
通过花括号包裹代码的方式,则可在JSX中嵌入任何表达式,比如JavaScript中的条件表达式和逻辑运算符。
JavaScript中&&
运算符的表达式遵循如下规则:
true && expression
总是会返回expression
false && expression
总是会返回false
因此,在React中JSX嵌入的表达式中:
true && 元素
,则会渲染&&
右侧的元素(JSX形式的元素)false && 元素
,如果是false,React会忽略并跳过它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 = ['专否', 'Re: 专否', 'Re:Re: 专否']; ReactDOM.render( <Mailbox unreadMessages={messages} />, document.getElementById('root') );
condition ? true : false
是JavaScript中的三目运算符的使用格式,关于三元运算符的介绍可查看这里。
如下所示,在React中使用三目运算符:
function Zhuanfou(props) { return <h1>专否 {props.slogan == '反清复明' ? '666' : '-_-'}</h1>; } ReactDOM.render( <Zhuanfou slogan="反清复明" />, document.getElementById('root') );
在极少数情况下需要阻止组件渲染而把组件隐藏起来;若要完成这类操作,可让render方法直接返回null,从而不进行任何渲染。如下例所示,<WarningBanner />
会根据prop参数中的warn值来进行条件渲染,若warn等于false,则组件不会渲染。
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') );