React 条件渲染组件

组件通常需要根据不同的条件显示不同的内容,以及根据应用的状态变化只渲染其中的一部分。

React 中,可以使用 JavaScript 语法有条件地呈现 JSX,比如 if 语句、&&?: 操作符。

根据条件返回 JSX

Demo.js 文件:

function Item ({ name, isPacked }) {
  if (isPacked) {
    return <li className="item">{name}</li>;
  }
  return <li className="item">{name}</li>;
}

export default function PackingList () {
  return (
    <section>
      <h1>Conditionally returning JSX demo</h1>
      <ul>
        <Item
          isPacked={true}
          name="I like apple"
        />
        <Item
          isPacked={true}
          name="He likes banana"
        />
        <Item
          isPacked={false}
          name="She likes watermelon"
        />
      </ul>
    </section>
  );
}


页面效果:
在这里插入图片描述

阻止组件渲染

在极少数情况下,希望隐藏组件,即使它被其他组件渲染。可以让 render 方法返回 null 而不是它的渲染结果即可实现。

在下面的例子中,<Item /> 根据属性 isPacked 的值条件渲染。如果 isPacked 的值是 true,则组件不会渲染:

function Item ({ name, isPacked }) {
  if (isPacked) {
    return null;
  }
  return <li className="item">{name}</li>;
}

export default function PackingList () {
  return (
    <section>
      <h1>Conditionally returning JSX demo</h1>
      <ul>
        <Item
          isPacked={true}
          name="I like apple"
        />
        <Item
          isPacked={true}
          name="He likes banana"
        />
        <Item
          isPacked={false}
          name="She likes watermelon"
        />
      </ul>
    </section>
  );
}

页面效果:
在这里插入图片描述
组件的 render 方法返回 null 并不会影响该组件生命周期方法的回调。例如,componentWillUpdatecomponentDidUpdate 依然可以被调用。

条件包含在 JSX 中

三元表达式(? :)

function Item ({ name, isPacked }) {
  return <li className="item">{isPacked ? name + ' ✔' : name}</li>;
}

export default function PackingList () {
  return (
    <section>
      <h1>Conditionally returning JSX demo</h1>
      <ul>
        <Item
          isPacked={true}
          name="I like apple"
        />
        <Item
          isPacked={true}
          name="He likes banana"
        />
        <Item
          isPacked={false}
          name="She likes watermelon"
        />
      </ul>
    </section>
  );
}

页面效果:
在这里插入图片描述

也可以将表达式包裹在另一个 HTML 标记中,如下:

function Item ({ name, isPacked }) {
  return <li className="item">{isPacked ? (<del>{name + ' ✔'}</del>) : (name)}</li>;
}

export default function PackingList () {
  return (
    <section>
      <h1>Conditionally returning JSX demo</h1>
      <ul>
        <Item
          isPacked={true}
          name="I like apple"
        />
        <Item
          isPacked={true}
          name="He likes banana"
        />
        <Item
          isPacked={false}
          name="She likes watermelon"
        />
      </ul>
    </section>
  );
}

页面效果:
在这里插入图片描述

逻辑与运算符 (&&)

可以通过用花括号包裹代码在 JSX 中嵌入任何表达式 ,也包括 JavaScript 的逻辑与 &&,它可以方便地条件渲染一个元素。

上面的写法也可以改写成如下:

function Item ({ name, isPacked }) {
  return <li className="item">{name}{isPacked && ' ✔'}</li>;
}

export default function PackingList () {
  return (
    <section>
      <h1>Conditionally returning JSX demo</h1>
      <ul>
        <Item
          isPacked={true}
          name="I like apple"
        />
        <Item
          isPacked={true}
          name="He likes banana"
        />
        <Item
          isPacked={false}
          name="She likes watermelon"
        />
      </ul>
    </section>
  );
}

页面效果:
在这里插入图片描述

JavaScript 中,true && expression 总是返回 expression,而 false && expression 总是返回 false

因此,针对上面的例子,如果 isPacked 条件是 true&& 右侧的元素就会被渲染,如果是 falseReact 会忽略并跳过它。

元素变量

可以使用变量来储存元素实现有条件的渲染组件的一部分,而输出的其他部分不会更改。如下:

function Item ({ name, isPacked }) {
  let str = name + '❌'
  if (isPacked) {
    str = (
      <del>{name + ' ✔'}</del>
    )
  }
  return (
    <li className="item">{str}</li>
  )
}

export default function PackingList () {
  return (
    <section>
      <h1>Conditionally returning JSX demo</h1>
      <ul>
        <Item
          isPacked={true}
          name="I like apple"
        />
        <Item
          isPacked={true}
          name="He likes banana"
        />
        <Item
          isPacked={false}
          name="She likes watermelon"
        />
      </ul>
    </section>
  );
}

页面效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值