学习React中的条件性渲染

113 阅读3分钟

现在我们要学习的是如何在React中进行条件性渲染。换句话说,如果一个条件存在,那么我们就会渲染一个特定的信息。如果存在一个不同的条件,那么我们就会向浏览器渲染一个不同的信息。嗯,React不是一种模板语言,所以我们不能访问基于HTML的if或else指令。没问题,我们只需将该逻辑转移到普通的JavaScript中。现在让我们看看如何做到这一点。


有条件地渲染一个列表

我们可以从刚才的列表渲染例子开始做起。这只是一个有三个项目的简单数组,然后使用map函数在JSX标记中把它们全部呈现出来。

import React, { Component } from "react";

class Item extends Component {
  state = {
    listitems: ["List Item 1", "List Item 2", "List Item 3"]
  };

  render() {
    return (
      <React.Fragment>
        <ul className="list-group">
          {this.state.listitems.map(listitem => (
            <li className="list-group-item list-group-item-primary">
              {listitem}
            </li>
          ))}
        </ul>
      </React.Fragment>
    );
  }
}

export default Item;

simple react list
上面的代码很好用,但如果数组中没有项目会怎样?在这种情况下,显示一条 "没有可用的项目 "或类似的信息可能会更好。因此,基于数组中存在一个或多个项目的条件,我们就显示列表,否则,如果数组中没有项目,我们就应该在屏幕上这样说。下面是一个例子,说明我们如何在React中做到这一点。


使用一个辅助方法

让我们给组件添加一个辅助方法,以帮助完成这项任务。首先,让我们把这个方法的结构写下来。它看起来有点像下面的内容。

  renderItems() {
    if (this.state.listitems.length === 0) {

      // Display an empty list message

    } else {

      // Display the list items

    }
  }

我们要做的是,首先检查listitems数组中是否有任何项目。如果它没有项目,我们将显示空列表信息。如果它确实有项目,那么我们就需要显示它们。


从一个函数中返回 JSX

在任何一个条件下,我们都需要返回一些JSX,可以在我们的React.Fragment标签中使用。所以这就是应该工作的标记。在第一种情况下,我们返回一个JSX表达式,这是一个Bootstrap警报。在另一种情况下,我们只是把渲染列表的逻辑移到这个函数中,并返回它。

  renderItems() {
    if (this.state.listitems.length === 0) {
      return (
        <div class="alert alert-warning" role="alert">
          There are no items to list!
        </div>
      );
    } else {
      return (
        <ul className="list-group">
          {this.state.listitems.map(listitem => (
            <li className="list-group-item list-group-item-primary">
              {listitem}
            </li>
          ))}
        </ul>
      );
    }
  }

在JSX中调用一个函数

现在我们已经将JJSX移到了一个决定如何渲染列表的函数中,我们需要包括对该函数的调用。我们在组件的render()函数中对我们的新函数进行调用,像这样。

render() {
  return <React.Fragment>{this.renderItems()}</React.Fragment>;
}

测试条件性渲染

所以,如果我们把这一切放在一起,我们就可以看到它是如何工作的。首先,我们将用四个单独的列表项来填充我们的listitems数组。

import React, { Component } from "react";

class Item extends Component {
  state = {
    listitems: ["List Item 1", "List Item 2", "List Item 3", "List Item 4"]
  };

  renderItems() {
    if (this.state.listitems.length === 0) {
      return (
        <div class="alert alert-warning" role="alert">
          There are no items to list!
        </div>
      );
    } else {
      return (
        <ul className="list-group">
          {this.state.listitems.map(listitem => (
            <li className="list-group-item list-group-item-primary">
              {listitem}
            </li>
          ))}
        </ul>
      );
    }
  }

  render() {
    return <React.Fragment>{this.renderItems()}</React.Fragment>;
  }
}

export default Item;

在这种情况下,列表中会有4个项目被渲染出来。很好。
react conditional rendering of list

现在,让我们清空这个数组。我们需要看看 renderItems() 函数中的逻辑是否正常工作。

import React, { Component } from "react";

class Item extends Component {
  state = {
    listitems: []
  };

  renderItems() {
    if (this.state.listitems.length === 0) {
      return (
        <div class="alert alert-warning" role="alert">
          There are no items to list!
        </div>
      );
    } else {
      return (
        <ul className="list-group">
          {this.state.listitems.map(listitem => (
            <li className="list-group-item list-group-item-primary">
              {listitem}
            </li>
          ))}
        </ul>
      );
    }
  }

  render() {
    return <React.Fragment>{this.renderItems()}</React.Fragment>;
  }
}

export default Item;

看起来我们现在得到了空列表的信息,这正是我们想要的。
react if else rendering


React中的条件性渲染总结

这只是一个例子,说明你在使用React时如何处理条件渲染。同样,由于没有像ng-if或v-if这样的自定义指令,我们需要依靠本地JavaScript来实现是否渲染某条信息的逻辑。如果不出意外的话,我们将使用这种技术来提高我们的本地JavaScript能力!