模擬根據登錄情況判斷要顯示的歡迎界面
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import PropTypes from 'prop-types';
function Greeting(props){
const state=props.state;
if(state){
return <UserGreeting />
}else{
return <GuestGreeting />
}
}
function UserGreeting(){
return (
<div>歡迎用戶</div>
)
}
function GuestGreeting(){
return (
<div>歡迎游客</div>
)
}
ReactDOM.render(
<div>
<Greeting state={false} />
</div>,
document.getElementById('example')
);
serviceWorker.unregister();

元素變數,可以使用變數來儲存元素
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import PropTypes from 'prop-types';
class Logincontrol extends React.Component{
constructor(props){
super(props);
this.LogoutHandler=this.LogoutHandler.bind(this);
this.LoginHandler=this.LoginHandler.bind(this);
this.state={
loginState:false
}
}
LogoutHandler(){
this.setState({
loginState:false
})
}
LoginHandler(){
this.setState({
loginState:true
})
}
render(){
const loginState=this.state.loginState;
let button=null;
if(loginState){//如果是登錄狀態
button=<LogoutBtn onClick={this.LogoutHandler}/>
}else{
button=<LoginBtn onClick={this.LoginHandler}/>
}
return(
<div>
<p>登錄狀態:{this.state.loginState?'已登錄':'未登錄'}</p>
{button}
</div>
)
}
}
function LogoutBtn(props){
return(
<button onClick={props.onClick}>退出登錄</button>
)
}
function LoginBtn(props){
return(
<button onClick={props.onClick}>點擊登錄</button>
)
}
ReactDOM.render(
<div>
<Logincontrol />
</div>,
document.getElementById('example')
);
serviceWorker.unregister();

可以通過用花括號包裹代碼在 JSX 中嵌入任何運算式 ,也包括 JavaScript 的邏輯與 &&,它可以方便地條件渲染一個元素
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import PropTypes from 'prop-types';
function Mail(props){
const msg=props.msg;
return(
<div>
{
msg.length>0 &&
<p>共有{msg.length}條未讀訊息</p>
}
</div>
)
}
const msg=[
'下午有空嗎?',
'明天有空嗎?'
];
ReactDOM.render(
<div>
<Mail msg={msg}/>
</div>,
document.getElementById('example')
);
serviceWorker.unregister();

三目運算子
條件渲染的另一種方法是使用 JavaScript 的條件運算子
剛才的判斷登錄條件,可以修改為:

阻止組件渲染
讓 render 方法回傳 null 即可實作
組件的 render 方法回傳 null 并不會影響該組件生命周期方法的回呼,
例如,componentWillUpdate 和 componentDidUpdate 依然可以被呼叫
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import PropTypes from 'prop-types';
class ShowWarning extends React.Component{
constructor(props){
super(props);
this.showHide=this.showHide.bind(this);
this.state={
warningState:true
}
}
showHide(){
this.setState(prevState=>({
warningState:!prevState.warningState
}))
}
hideHandler(){
this.setState({
warningState:false
})
}
render(){
return(
<div>
<WarnBanner warn={this.state.warningState}/>
<button onClick={this.showHide}>
{this.state.warningState?'隱藏':'顯示'}
</button>
</div>
)
}
}
function WarnBanner(props){
if(!props.warn){
return null
}else{
return(
<div>警告警告!!!</div>
)
}
}
ReactDOM.render(
<div>
<ShowWarning />
</div>,
document.getElementById('example')
);
serviceWorker.unregister();

setState() 可以接收一個函式,這個函式接受兩個引數
第一個引數表示上一個狀態值,第二引數表示當前的 props
this.setState((prevState, props) => ({ //do something here }));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/123504.html
標籤:JavaScript
