這是我參與更文挑戰的第20天,活動詳情檢視: 更文挑戰
引言
官方描述:React 中的條件渲染和 JavaScript 中的一樣,使用 JavaScript 運算符 if 或者條件運算符去建立元素來表現目前的狀态,然後讓 React 根據它們來更新 UI。
- 觀察下面兩個元件
function UserGreeting(props) {
return <h1>Welcome back!</h1>;
}
function GuestGreeting(props) {
return <h1>Please sign up.</h1>;
}
複制代碼
- 再建立一個 Greeting 元件,它會根據使用者是否登入來決定顯示上面的哪一個元件。
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')
);
複制代碼
這個示例根據 isLoggedIn 的值來渲染不同的問候語。
解讀
通俗的來說,就是React允許我們按需進行渲染,而不必渲染所有元件。
元素變量
官方描述:你可以使用變量來儲存元素。 它可以幫助你有條件地渲染元件的一部分,而其他的渲染部分并不會是以而改變。
在React中可以通過變量來存儲元素,需要的時候進行渲染。
- 觀察下面的兩個元件
function LoginButton(props) {
return (
<button onClick={props.onClick}>
Login
</button>
);
}
function LogoutButton(props) {
return (
<button onClick={props.onClick}>
Logout
</button>
);
}
複制代碼
官方描述:下面我們将建立一個名叫 LoginControl 的有狀态的元件。它将根據目前的狀态來渲染 或者 。同時它還會渲染上一個示例中的 。
- 下面是通過if語句來進行條件渲染
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 中的邏輯與 (&&) 運算符。它可以很友善地進行元素的條件渲染。
{unreadMessages.length > 0 &&
<h2>
You have {unreadMessages.length} unread messages.
</h2>
}
複制代碼
- 為什麼可以這麼寫?
之是以能這樣做,是因為在 JavaScript 中,true && expression 總是會傳回 expression, 而 false && expression 總是會傳回 false。
- 精選案例
render() {
const count = 0;
return (
<div>
{ count && <h1>Messages: {count}</h1>}
</div>
);
}
複制代碼
官方描述:請注意,傳回 false 的表達式會使 && 後面的元素被跳過,但會傳回 false 表達式。在下面示例中,render 方法的傳回值是 <div>0</div>。
三目運算符
- 執行個體
render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
</div>
);
}
複制代碼
render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
{isLoggedIn
? <LogoutButton onClick={this.handleLogoutClick} />
: <LoginButton onClick={this.handleLoginClick} />
}
</div>
);
}
複制代碼
官方提示:如果條件過于複雜,建議提取元件。
阻止條件渲染
官方描述:若要完成此操作,你可以讓 render 方法直接傳回 null,而不進行任何渲染。 下面的示例中, 會根據 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')
);
複制代碼
官方提示:在元件的 render 方法中傳回 null 并不會影響元件的生命周期。例如,上面這個示例中,componentDidUpdate 依然會被調用。