react文檔——條件渲染

條件渲染

在 React 中溉委,你可以創(chuàng)建一個(gè)囊括所有你需要行為的特定的組件点待。然后奏路,你可以根據(jù)你的應(yīng)用的 state 只渲染它們中的一部分畴椰。

React 中的條件渲染和 JavaScript 中的條件語(yǔ)句工作方式相同。使用 JavaScript 運(yùn)算符鸽粉,比如if條件運(yùn)算符來(lái)創(chuàng)建元素表示當(dāng)前的 state斜脂,并使 React 匹配它們來(lái)更新 UI。

考慮下面這兩個(gè)組件:

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

我們將會(huì)創(chuàng)建Greeting組件触机,根據(jù)用戶是否登陸來(lái)顯示這兩個(gè)組件中相應(yīng)的那一個(gè):

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')
);

CodePen上試試帚戳。

這個(gè)例子根據(jù)isLoggedIn prop 的值來(lái)渲染不同的問(wèn)候語(yǔ)句玷或。

元素變量

你可以使用變量來(lái)存儲(chǔ)元素。這可以幫助你有條件的渲染組件的一部分而其余的輸出不會(huì)改變片任。

考慮下面這兩個(gè)表示注銷和登陸按鈕的新組件:

function LoginButton(props) {
  return (
    <button onClick={props.onClick}>
      Login
    </button>
  );
}

function LogoutButton(props) {
  return (
    <button onClick={props.onClick}>
      Logout
    </button>
  );
}

在下面這個(gè)例子中偏友,我們會(huì)創(chuàng)建一個(gè)名為LoginControl有狀態(tài)組件

它會(huì)根據(jù)它當(dāng)前的 state 要么渲染<LoginButton />要么渲染<LogoutButton />蚂踊。它也會(huì)渲染前面例子中的<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 = null;
    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')
);

CodePen上試試约谈。

當(dāng)聲明一個(gè)變量并使用一個(gè)if語(yǔ)句來(lái)有條件的渲染一個(gè)組件是一種很好的方式,有時(shí)你可能想使用簡(jiǎn)化的語(yǔ)法犁钟。有幾種方式在 JSX 中內(nèi)聯(lián)條件的方式棱诱,下面詳細(xì)解釋。

使用邏輯與(&&)運(yùn)算符實(shí)現(xiàn)內(nèi)聯(lián)的 If

你可以在 JSX 中通過(guò)使用大括號(hào)包裹插入任何表達(dá)式涝动。這就包括 JavaScript 的邏輯與&&運(yùn)算符迈勋。這對(duì)有條件的包含一個(gè)元素是很方便的。

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')
);

CodePen上試試醋粟。

這是有效的靡菇,因?yàn)樵?JavaScript 中,true && expression的取值會(huì)一直是expression米愿,同樣false && expression的取值會(huì)一直是false厦凤。

因此,如果條件是true育苟,&&后面的元素會(huì)在輸出中顯示较鼓。如果是false,React 會(huì)忽略并跳過(guò)它违柏。

使用條件運(yùn)算符實(shí)現(xiàn)內(nèi)聯(lián)的 If-Else

另一個(gè)內(nèi)聯(lián)條件渲染元素的方法是使用 JavaScript 的條件運(yùn)算符condition ? true : false博烂。

在下面的例子中,我們使用它來(lái)有條件的渲染文本的一小塊漱竖。

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
    </div>
  );
}

它也可以被用在更大的表達(dá)式中禽篱,盡管它不能明顯的看出發(fā)生了什么(可讀性差)。

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      {isLoggedIn ? (
        <LogoutButton onClick={this.handleLogoutClick} />
      ) : (
        <LoginButton onClick={this.handleLoginClick} />
      )}
    </div>
  );
}

就像在 JavaScript 中馍惹,基于你和你的團(tuán)隊(duì)考慮更具可讀性躺率,由你來(lái)選擇恰當(dāng)?shù)娘L(fēng)格。也不要忘了讼积,當(dāng)條件開(kāi)始變得復(fù)雜的時(shí)候肥照,這正是提取組件的好時(shí)機(jī)。

阻止組件渲染

在少數(shù)情況下勤众,你可能想要一個(gè)組件隱藏它本身舆绎,即使它已經(jīng)被另一個(gè)組件渲染了。為此我們返回null來(lái)代替它的渲染輸出们颜。

在下面的例子中吕朵,<WarningBanner />的渲染取決于名為warn的 prop 的值猎醇。如果 prop 的值是false,那么這個(gè)組件不會(huì)被渲染:

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(prevState => ({
      showWarning: !prevState.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')
);

下一步

列表和鍵

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末努溃,一起剝皮案震驚了整個(gè)濱河市硫嘶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梧税,老刑警劉巖沦疾,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異第队,居然都是意外死亡哮塞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門凳谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忆畅,“玉大人,你說(shuō)我怎么就攤上這事尸执〖铱” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵如失,是天一觀的道長(zhǎng)绊诲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)褪贵,這世上最難降的妖魔是什么驯镊? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮竭鞍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橄镜。我一直安慰自己偎快,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布洽胶。 她就那樣靜靜地躺著晒夹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姊氓。 梳的紋絲不亂的頭發(fā)上丐怯,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天硅卢,我揣著相機(jī)與錄音县好,去河邊找鬼。 笑死蠢络,一個(gè)胖子當(dāng)著我的面吹牛禾唁,可吹牛的內(nèi)容都是我干的效览。 我是一名探鬼主播无切,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丐枉!你這毒婦竟也來(lái)了哆键?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘦锹,失蹤者是張志新(化名)和其女友劉穎籍嘹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弯院,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辱士,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抽兆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识补。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辫红,靈堂內(nèi)的尸體忽然破棺而出凭涂,到底是詐尸還是另有隱情,我是刑警寧澤贴妻,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布切油,位于F島的核電站,受9級(jí)特大地震影響名惩,放射性物質(zhì)發(fā)生泄漏澎胡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一娩鹉、第九天 我趴在偏房一處隱蔽的房頂上張望攻谁。 院中可真熱鬧,春花似錦弯予、人聲如沸戚宦。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)受楼。三九已至,卻和暖如春呼寸,著一層夾襖步出監(jiān)牢的瞬間艳汽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工对雪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留河狐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甚牲,于是被迫代替她去往敵國(guó)和親义郑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本筆記基于React官方文檔丈钙,當(dāng)前React版本號(hào)為15.4.0非驮。 1. 安裝 1.1 嘗試 開(kāi)始之前可以先去co...
    Awey閱讀 7,658評(píng)論 14 128
  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書,強(qiáng)調(diào)了記筆記和堅(jiān)持的重要性雏赦。這幾天也剛好在學(xué)習(xí)React劫笙,所以我打算每天堅(jiān)持一篇R...
    gaoer1938閱讀 1,672評(píng)論 0 5
  • 原教程內(nèi)容詳見(jiàn)精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記星岗,個(gè)人覺(jué)得該教程講解深入淺出填大,比目前大...
    leonaxiong閱讀 2,813評(píng)論 1 18
  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時(shí),對(duì)React的特性俏橘、重點(diǎn)和注意事項(xiàng)的提取允华、精練和總結(jié),可以做為React特性...
    科研者閱讀 8,222評(píng)論 2 21
  • ListView數(shù)據(jù)的展示主要依靠是Adapter數(shù)據(jù)適配器 ArrayAdapter:支持泛型操作寥掐,最簡(jiǎn)單的一個(gè)...
    leo1091閱讀 425評(píng)論 0 0