天天看點

條件渲染 (精讀React官方文檔—07)

這是我參與更文挑戰的第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 依然會被調用。

歡迎大家關注專欄,一起學習React!

繼續閱讀