我如何选择在JSX中包含一个元素?下面是一个使用横幅的例子,如果它已经被传入,那么它应该在组件中。我想避免的是在if语句中重复HTML标记。
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
If样式组件是危险的,因为无论条件如何,代码块总是被执行。例如,如果banner为空,这将导致一个空异常:
//dangerous
render: function () {
return (
<div id="page">
<If test={this.state.banner}>
<img src={this.state.banner.src} />
</If>
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
另一种选择是使用内联函数(对else语句特别有用):
render: function () {
return (
<div id="page">
{function(){
if (this.state.banner) {
return <div id="banner">{this.state.banner}</div>
}
}.call(this)}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
react问题的另一个选项:
render: function () {
return (
<div id="page">
{ this.state.banner &&
<div id="banner">{this.state.banner}</div>
}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
这是一篇关于React中所有条件渲染的不同选项的文章。
何时使用哪种条件渲染的关键要点:
* * if - else
最基本的是条件渲染吗
初学者友好
使用if可以通过返回null提早退出渲染方法
**三元运算符
在if-else语句外使用它
它比if-else更简洁
逻辑&&运算符
当三元操作的一侧返回null时使用它
**开关箱
详细的
只能内联自调用函数
避免使用枚举
** 枚举
完美地映射不同的州
完美地映射不止一个条件
**多级/嵌套条件渲染
为了可读性,避免使用它们
将组件拆分为具有自己的简单条件呈现的更轻量级的组件
使用的
** HOC
使用它们来屏蔽条件呈现
组件可以专注于它们的主要用途
**外部模板组件
避免使用它们,熟悉JSX和JavaScript
下面是我使用ES6的方法。
import React, { Component } from 'react';
// you should use ReactDOM.render instad of React.renderComponent
import ReactDOM from 'react-dom';
class ToggleBox extends Component {
constructor(props) {
super(props);
this.state = {
// toggle box is closed initially
opened: false,
};
// http://egorsmirnov.me/2015/08/16/react-and-es6-part3.html
this.toggleBox = this.toggleBox.bind(this);
}
toggleBox() {
// check if box is currently opened
const { opened } = this.state;
this.setState({
// toggle value of `opened`
opened: !opened,
});
}
render() {
const { title, children } = this.props;
const { opened } = this.state;
return (
<div className="box">
<div className="boxTitle" onClick={this.toggleBox}>
{title}
</div>
{opened && children && (
<div class="boxContent">
{children}
</div>
)}
</div>
);
}
}
ReactDOM.render((
<ToggleBox title="Click me">
<div>Some content</div>
</ToggleBox>
), document.getElementById('app'));
演示:http://jsfiddle.net/kb3gN/16688/
我使用的代码如下:
{opened && <SomeElement />}
仅当opened为true时才会呈现SomeElement。它的工作原理在于JavaScript解析逻辑条件的方式:
true && true && 2; // will output 2
true && false && 2; // will output false
true && 'some string'; // will output 'some string'
opened && <SomeElement />; // will output SomeElement if `opened` is true, will output false otherwise
由于React会忽略false,我发现它是有条件渲染某些元素的好方法。