> 文章列表 > React 条件渲染组件

React 条件渲染组件

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><ItemisPacked={true}name="I like apple"/><ItemisPacked={true}name="He likes banana"/><ItemisPacked={false}name="She likes watermelon"/></ul></section>);
}

页面效果:
React 条件渲染组件

阻止组件渲染

在极少数情况下,希望隐藏组件,即使它被其他组件渲染。可以让 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><ItemisPacked={true}name="I like apple"/><ItemisPacked={true}name="He likes banana"/><ItemisPacked={false}name="She likes watermelon"/></ul></section>);
}

页面效果:
React 条件渲染组件
组件的 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><ItemisPacked={true}name="I like apple"/><ItemisPacked={true}name="He likes banana"/><ItemisPacked={false}name="She likes watermelon"/></ul></section>);
}

页面效果:
React 条件渲染组件

也可以将表达式包裹在另一个 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><ItemisPacked={true}name="I like apple"/><ItemisPacked={true}name="He likes banana"/><ItemisPacked={false}name="She likes watermelon"/></ul></section>);
}

页面效果:
React 条件渲染组件

逻辑与运算符 (&&)

可以通过用花括号包裹代码在 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><ItemisPacked={true}name="I like apple"/><ItemisPacked={true}name="He likes banana"/><ItemisPacked={false}name="She likes watermelon"/></ul></section>);
}

页面效果:
React 条件渲染组件

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><ItemisPacked={true}name="I like apple"/><ItemisPacked={true}name="He likes banana"/><ItemisPacked={false}name="She likes watermelon"/></ul></section>);
}

页面效果:
React 条件渲染组件