渲染 React 组件时如何添加逻辑 if 语句?
How to add logical if statement when rendering React components?
如果我有这样的代码...
var Lounge = React.createClass({displayName: "Lounge",
render: function() {
return (
React.createElement("a", {href:"/lounge/detail/" + this.props.id + "/"},
React.createElement("div", {className: "lounge"},
React.createElement("h2", {className: "loungeAuthor"},
this.props.author.name
),
React.createElement("p", {className: "loungeArticle"},
this.props.article
),
React.createElement("img", {className: "loungeImage", src: this.props.image})
)
)
);
}
});
如果图像数据存在,我需要进行逻辑检查以仅渲染 "img" 组件。有人知道使用 React 解决这个问题的最佳方法吗?
好吧,这对很多人来说可能很清楚,出于某种原因我没有看到它,然后我再次快速浏览文档并且我没有使用 JSX(真的不喜欢它)
因此,JavaScript 在渲染 React 组件时添加逻辑 if 检查的方法将像这样完成。 (请记住 undefined 工作得很好,所以假设没有命中 if 语句它仍然会很好地呈现)
var Lounge = React.createClass({displayName: "Lounge",
render: function() {
if (this.props.image != "") {
var imageElement = React.createElement("img", {className: "loungeImage", src: this.props.image});
}
return (
React.createElement("a", {href:"/lounge/detail/" + this.props.id + "/"},
React.createElement("div", {className: "lounge"},
React.createElement("h2", {className: "loungeAuthor"},
this.props.author.name
),
React.createElement("p", {className: "loungeArticle"},
this.props.article
),
imageElement
)
)
);
}
});
如果你想内联,你可以这样做:
{this.props.image && <img className="loungeImage" src={this.props.image}/>}
this.props.image && React.createElement("img", {className: "loungeImage", src: this.props.image})
如果您要检查的值是假的,但会导致 某些东西 被 React 渲染,就像一个空字符串,您可能想将它转换为它的布尔等价物使用 !!
:
检查
{!!this.props.image && <img className="loungeImage" src={this.props.image}/>}
!!this.props.image && React.createElement("img", {className: "loungeImage", src: this.props.image})
保持此逻辑内联以及使用 JSX 可能有助于提高可读性
import React from 'react';
import PropTypes from 'prop-types';
import s from './Lounge.css'; // See CSS Modules
// Stateless functional component (since there is no state)
function Lounge({ id, article, author, imageUrl }) {
return (
<a href={`/lounge/detail/${id}/`}>
<span className={s.lounge}>
<span className={s.author}>{author.name}</span>
<span className={s.article}>{article}</span>
{imageUrl && <img className={s.image} src={imageUrl} />} // <==
</span>
</a>
);
}
// Props validation
Lounge.propTypes = {
id: PropTypes.number.isRequired,
article: PropTypes.string.isRequired,
imageUrl: PropTypes.string,
author: PropTypes.shape({
name: PropTypes.string.isRequired
}).isRequired
};
export default Lounge;
您可以使用 React if component:
var Node = require('react-if-comp');
var Lounge = React.createClass({
displayName: 'Lounge',
render: function() {
return (
<a href={'/lounge/detail/' + this.props.id + '/'}>
<div className='lounge'>
<h2 className='loungeAuthor'>{author.name}</h2>
<p className='loungeArticle'>{article}</p>
<Node if={this.props.image}
then={<img className='loungeImage'
src={this.props.image} />} />
</div>
</a>
);
}
});
使用 JSX + IIFE(立即调用函数)可以非常方便和明确:
{(() => {
if (isEmpty(routine.queries)) {
return <Grid devices={devices} routine={routine} configure={() => this.setState({configured: true})}/>
} else if (this.state.configured) {
return <DeviceList devices={devices} routine={routine} configure={() => this.setState({configured: false})}/>
} else {
return <Grid devices={devices} routine={routine} configure={() => this.setState({configured: true})}/>
}
})()}
如果我有这样的代码...
var Lounge = React.createClass({displayName: "Lounge",
render: function() {
return (
React.createElement("a", {href:"/lounge/detail/" + this.props.id + "/"},
React.createElement("div", {className: "lounge"},
React.createElement("h2", {className: "loungeAuthor"},
this.props.author.name
),
React.createElement("p", {className: "loungeArticle"},
this.props.article
),
React.createElement("img", {className: "loungeImage", src: this.props.image})
)
)
);
}
});
如果图像数据存在,我需要进行逻辑检查以仅渲染 "img" 组件。有人知道使用 React 解决这个问题的最佳方法吗?
好吧,这对很多人来说可能很清楚,出于某种原因我没有看到它,然后我再次快速浏览文档并且我没有使用 JSX(真的不喜欢它)
因此,JavaScript 在渲染 React 组件时添加逻辑 if 检查的方法将像这样完成。 (请记住 undefined 工作得很好,所以假设没有命中 if 语句它仍然会很好地呈现)
var Lounge = React.createClass({displayName: "Lounge",
render: function() {
if (this.props.image != "") {
var imageElement = React.createElement("img", {className: "loungeImage", src: this.props.image});
}
return (
React.createElement("a", {href:"/lounge/detail/" + this.props.id + "/"},
React.createElement("div", {className: "lounge"},
React.createElement("h2", {className: "loungeAuthor"},
this.props.author.name
),
React.createElement("p", {className: "loungeArticle"},
this.props.article
),
imageElement
)
)
);
}
});
如果你想内联,你可以这样做:
{this.props.image && <img className="loungeImage" src={this.props.image}/>}
this.props.image && React.createElement("img", {className: "loungeImage", src: this.props.image})
如果您要检查的值是假的,但会导致 某些东西 被 React 渲染,就像一个空字符串,您可能想将它转换为它的布尔等价物使用 !!
:
{!!this.props.image && <img className="loungeImage" src={this.props.image}/>}
!!this.props.image && React.createElement("img", {className: "loungeImage", src: this.props.image})
保持此逻辑内联以及使用 JSX 可能有助于提高可读性
import React from 'react';
import PropTypes from 'prop-types';
import s from './Lounge.css'; // See CSS Modules
// Stateless functional component (since there is no state)
function Lounge({ id, article, author, imageUrl }) {
return (
<a href={`/lounge/detail/${id}/`}>
<span className={s.lounge}>
<span className={s.author}>{author.name}</span>
<span className={s.article}>{article}</span>
{imageUrl && <img className={s.image} src={imageUrl} />} // <==
</span>
</a>
);
}
// Props validation
Lounge.propTypes = {
id: PropTypes.number.isRequired,
article: PropTypes.string.isRequired,
imageUrl: PropTypes.string,
author: PropTypes.shape({
name: PropTypes.string.isRequired
}).isRequired
};
export default Lounge;
您可以使用 React if component:
var Node = require('react-if-comp');
var Lounge = React.createClass({
displayName: 'Lounge',
render: function() {
return (
<a href={'/lounge/detail/' + this.props.id + '/'}>
<div className='lounge'>
<h2 className='loungeAuthor'>{author.name}</h2>
<p className='loungeArticle'>{article}</p>
<Node if={this.props.image}
then={<img className='loungeImage'
src={this.props.image} />} />
</div>
</a>
);
}
});
使用 JSX + IIFE(立即调用函数)可以非常方便和明确:
{(() => {
if (isEmpty(routine.queries)) {
return <Grid devices={devices} routine={routine} configure={() => this.setState({configured: true})}/>
} else if (this.state.configured) {
return <DeviceList devices={devices} routine={routine} configure={() => this.setState({configured: false})}/>
} else {
return <Grid devices={devices} routine={routine} configure={() => this.setState({configured: true})}/>
}
})()}