JSX 中内联条件渲染的方法

在 React 中,可以创建不同的组件来封装各种你需要的行为。然后,依据应用的不同状态,只渲染对应状态下的部分内容。
React 中的条件渲染和 JavaScript 中的一样,使用 JavaScript 运算符 if 去创建元素来表现当前的状态,然后让 React 根据它们来更新 UI。if 语句进行条件渲染是不错的方式,但有时你可能会想使用更为简洁的语法。接下来,我们将介绍几种在 JSX 中内联条件渲染的方法。

1、与运算符 &&

通过花括号包裹代码,你可以在 JSX 中嵌入任何表达式。这也包括 JavaScript 中的逻辑与 (&&) 运算符。它可以很方便地进行元素的条件渲染。

 <script type="text/babel">
      function Mailbox(props) {
        const unreadMessages = props.unreadMessages;
        const readedMessages = props.readedMeaasges;
        return (
          <div>
            <h1>Hello!</h1>
            {unreadMessages.length > 0 && (
              <h2>You have {unreadMessages.length} unread messages.</h2>
            )}
            {readedMessages.length > 0 && (
              <h2>You have {readedMessages.length} readed messages.</h2>
            )}
          </div>
        );
      }

      const unReadMessages = ["React", "Re: React", "Re:Re: React"];
      const readedMeaasges = ["JS", "HTML", "CSS", "Less", "ES6"];
      ReactDOM.render(
        <Mailbox unreadMessages={unReadMessages} readedMeaasges={readedMeaasges} />,
        document.getElementById("root")
      );
    </script>

2、三目运算符

通过使用 JavaScript 中的三目运算符 condition ? true : false

 <script type="text/babel">
      function Mailbox(props) {
        const unreadMessages = props.unreadMessages;
        const readedMessages = props.readedMeaasges;
        return (
          <div>
            <h1>Hello!</h1>
            {unreadMessages.length > 0 && (
              <h2>You have {unreadMessages.length} unread messages.</h2>
            )}
            {readedMessages.length > 0 && (
              <h2>You have {readedMessages.length} readed messages.</h2>
            )}
            {readedMessages.length < unreadMessages.length ? (
              <h2>You have more unread messages.</h2>
            ) : (
              <h2>You have more readed messages.</h2>
            )}
          </div>
        );
      }

      const unReadMessages = ["React", "Re: React", "Re:Re: React"];
      const readedMeaasges = ["JS", "HTML", "CSS", "Less", "ES6"];
      ReactDOM.render(
        <Mailbox
          unreadMessages={unReadMessages}
          readedMeaasges={readedMeaasges}
        />,
        document.getElementById("root")
      );
    </script>

3、隐藏渲染(阻止组件渲染)

在极少数情况下,你可能希望能隐藏组件,即使它已经被其他组件渲染。可以让 render 方法直接返回 null,而不进行任何渲染。

 <script type="text/babel">
      function WarningBanner(props) {
        if (!props.warn) {
          return null;
        }

        return <div className="warn_area">Waring! Waring! Waring! err~~~</div>;
      }

      class Page extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            showWarning: true
          };
        }

        handleToggleClick() {
          this.setState(
            (state, props) => ({
              showWarning: !state.showWarning
            }),
            () => {
              console.log("修改成功!");
            }
          );
        }

        render() {
          return (
            <div>
              <WarningBanner warn={this.state.showWarning} />
              <button onClick={this.handleToggleClick.bind(this)}>
                {this.state.showWarning ? "Hide" : "Show"}
              </button>
            </div>
          );
        }
      }
      ReactDOM.render(<Page />, document.getElementById("root"));
    </script>

运行在浏览器:



在组件的 render 方法中返回 null 并不会影响组件的生命周期。在上例的基础上添加componentDidUpdate 方法,componentDidUpdate 依然会被调用。

     componentDidUpdate(prevProps, prevState) {
          console.log('prevState'+JSON.stringify(prevState));          
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,303评论 2 21
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,545评论 1 33
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,323评论 0 9
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,862评论 1 18
  • $ 前言   最近在考虑框架转型,鉴于作为一名JSer,要时时刻刻保持对新技术和流行技术的敏感性,而 React、...
    果汁凉茶丶阅读 22,117评论 5 32