条件渲染

组件经常需要根据不同条件显示不同内容。在React中,你可以使用类似于if语句、&&和?:运算符的JavaScript语法有条件地呈现JSX。

你将学到:

  • 如何根据条件返回不同的JSX

  • 如何有条件地包含或排除一段JSX

  • 在React代码库中常见的条件语法快捷方式

有条件地返回JSX

假设你有一个PackingList组件,渲染多个项目,这些项目可以标记为已打包或未打包:

function Item({ name, isPacked }) {
  return {name};
}

export default function PackingList() {
  return (
    
      

Sally Ride's Packing List

      
                                     
    
  ); }

注意到一些Item组件的isPacked属性被设置为true,而不是false。如果isPacked={true},你想在已打包的项目中添加一个勾号(✔)。

你可以使用if/else语句编写如下:

if (isPacked) {
  return {name} ✔;
}
return {name};

如果isPacked属性为true,则该代码返回一个不同的JSX树。通过这个更改,一些项目在末尾会显示一个勾号:

function Item({ name, isPacked }) {
  if (isPacked) {
    return {name} ✔;
  }
  return {name};
}

export default function PackingList() {
  return (
    
      

Sally Ride's Packing List

      
                                     
    
  ); }

尝试编辑返回值,观察结果的变化!

注意到你正在使用JavaScript的if和return语句来创建分支逻辑。在React中,控制流(如条件)是由JavaScript处理的。

使用null有条件地返回什么也不渲染

在某些情况下,你可能不想渲染任何东西。例如,假设你根本不想显示已打包的项目。一个组件必须返回一些内容。在这种情况下,你可以返回null:

if (isPacked) {
  return null;
}
return {name};

如果isPacked为true,该组件将返回空值null,否则,它将返回用于渲染的JSX。

function Item({ name, isPacked }) {
  if (isPacked) {
    return null;
  }
  return {name};
}

export default function PackingList() {
  return (
    
      

Sally Ride's Packing List

      
                                     
    
  ); }

实际上,在组件中返回null并不常见,因为它可能会让尝试渲染它的开发人员感到惊讶。通常,你会有条件地在父组件的JSX中包含或排除该组件。以下是如何实现这一点!

有条件地包含JSX

在前面的示例中,你控制了组件将返回哪个(如果有的话!)JSX树。你可能已经注意到了渲染输出中的一些重复:

{name} ✔

和下面这段代码非常相似:

{name}

两个条件分支都返回

  • ...
  • if (isPacked) {
      return {name} ✔;
    }
    return {name};

    虽然这种重复没有害处,但它可能会使你的代码更难维护。如果你想要改变className会怎么样呢?你必须在代码中的两个地方进行更改!在这种情况下,你可以有条件地包含一些JSX,使你的代码更加DRY。

    条件(三目)运算符(? :)

    JavaScript有一种紧凑的语法来编写条件表达式 - 条件运算符或“三目运算符”。

    你可以用它来代替:

    if (isPacked) {
      return {name} ✔;
    }
    return {name};

    可以写成这样:

    return (
      
        {isPacked ? name + ' ✔' : name}
      
    );

    可以将其理解为“如果isPacked为true,则(?)呈现name+'✔',否则(:)呈现name”。

    现在假设你想要将完成的条目文本包装在另一个HTML标记中,例如来划掉它。你可以添加更多的换行符和括号,这样就可以更容易地嵌套更多的JSX在每个情况下:

    function Item({ name, isPacked }) {
      return (
        
          {isPacked ? (
            
              {name + ' ✔'}
            
          ) : (
            name
          )}
        
      );
    }
    
    export default function PackingList() {
      return (
        
          

    Sally Ride's Packing List

          
                                       
        
      ); }

    这种方式适用于简单的条件,但是要适度使用。如果你的组件具有太多嵌套的条件标记而变得混乱,请考虑提取子组件以清理代码。在React中,标记是代码的一部分,因此您可以使用变量和函数等工具来整理复杂的表达式。

    逻辑与(&&)运算符

    你会遇到的另一个常用的快捷方式是JavaScript的逻辑与(&&)运算符。在React组件中,当您希望在条件为真时呈现一些JSX,否则不呈现任何东西时,它经常出现。使用&&,您可以仅在isPacked为true时有条件地呈现复选标记:

    return (
      
        {name} {isPacked && '✔'}
      
    );

    你可以理解为“如果isPacked为真,则(&&)渲染勾号,否则不渲染任何东西”。

    下面是它的实现:

    function Item({ name, isPacked }) {
      return (
        
          {name} {isPacked && '✔'}
        
      );
    }
    
    export default function PackingList() {
      return (
        
          

    Sally Ride's Packing List

          
                                       
        
      ); }

    当 JavaScript 的 && 表达式左侧(我们的条件)为 true 时,它返回右侧的值(在我们的示例中,是打勾符号)。但如果条件为 false,整个表达式将变为 false。React 将 false 视为 JSX 树中的“空洞”,就像 null 或 undefined 一样,并在其位置上不呈现任何内容。

    陷阱:不要将数字放在 && 的左侧。

    为了测试条件,JavaScript 会自动将左侧转换为布尔值。但是,如果左侧是 0,则整个表达式得到的值就是 0,而 React 将愉快地呈现 0 而不是什么都不呈现。

    例如,常见的错误是编写类似 messageCount &&

    New messages

    的代码。很容易假设当 messageCount 为 0 时,它什么也不呈现,但它实际上会呈现 0 本身!

    要修复它,请将左侧设置为布尔值:messageCount > 0 &&

    New messages

    有条件地将 JSX 赋给变量

    当快捷方式妨碍编写普通代码时,请尝试使用 if 语句和变量。您可以使用 let 定义的变量进行重新赋值,因此首先提供您要显示的默认内容,即名称:

    let itemContent = name;

    使用 if 语句将 JSX 表达式重新分配给 itemContent(如果 isPacked 为 true):

    if (isPacked) {
      itemContent = name + " ✔";
    }

    花括号打开了“JavaScript 的窗口”。使用花括号嵌套先前计算出的表达式,将变量嵌入返回的 JSX 树中:

    
      {itemContent}
    

    这种风格最冗长,但也是最灵活的。以下是实例:

    function Item({ name, isPacked }) {
      let itemContent = name;
      if (isPacked) {
        itemContent = name + " ✔";
      }
      return (
        
          {itemContent}
        
      );
    }
    
    export default function PackingList() {
      return (
        
          

    Sally Ride's Packing List

          
                                       
        
      ); }

    与之前一样,这不仅适用于文本,还适用于任意的 JSX。

    function Item({ name, isPacked }) {
      let itemContent = name;
      if (isPacked) {
        itemContent = (
          
            {name + " ✔"}
          
        );
      }
      return (
        
          {itemContent}
        
      );
    }
    
    export default function PackingList() {
      return (
        
          

    Sally Ride's Packing List

          
                                       
        
      ); }

    如果您不熟悉 JavaScript,这些样式的多样性可能会一开始让您感到不知所措。然而,学习它们将有助于您阅读和编写任何 JavaScript 代码,而不仅仅是 React 组件!首先选择您喜欢的风格,如果您忘记了其他风格的工作方式,请再次参考此参考文献。

    总结

    条件渲染_第1张图片

    长按关注

    帮助 10W 人入门并进阶前端

    你可能感兴趣的:(javascript,前端,react.js,typescript,前端框架)