我写了一个反应组件,它呈现评级和可视化它与星星。但我不得不使用dangerouslySetInnerHTML。如果没有dangerouslySetInnerHTML,我怎么能用更好的代码风格重写组件?谢谢你的帮助。
export default class BookRating extends React.Component {
renderStars = () => {
let result = '';
for(let i=1; i<=5; i++) {
this.props.rating >= i
? result += '<div class="fa fa-star checked"></div>'
: result += '<div class="fa fa-star"></div>'
}
return result;
}
render () {
return (
<div className="rating" dangerouslySetInnerHTML={{ __html: this.renderStars() }} />
);
}
}发布于 2019-07-02 14:56:05
可以使用数组而不是字符串呈现多个元素:
export default class BookRating extends React.Component {
renderStars = () => {
let result = [];
for(let i=1; i<=5; i++) {
this.props.rating >= i
? result.push(<div key={i} class="fa fa-star checked"></div>)
: result.push(<div key={i} class="fa fa-star"></div>'
}
return result;
}
render () {
return (
<div className="rating">{this.renderStars()}</div>
);
}
}正如Quentin和Emile所指出的,您可以将此函数写成一行,如下所示:
renderStars = () => Array(5).fill(0).map(_, i => <div className={`fa fa-star${this.props.rating > i ? ' checked' : ''}`}/>)发布于 2019-07-02 15:13:27
我做了一些类似的事情,也支持半星,并为剩下的点显示“空”星(例如3.5颗星显示3颗满号星、1颗半星和1颗空星):
const Rating = ({ rating }) => {
rating = Math.round(rating * 2) / 2
const fullStars = Math.floor(rating)
const halfStars = rating - fullStars > 0.2 ? 1 : 0
const emptyStars = 5 - fullStars - halfStars
return (
<div css={{ whiteSpace: "nowrap", ".fa": { color: "yellow" } }}>
{[...Array(fullStars)].map((_, index) => (
<span key={`f-${index}`} className="fa fa-star" />
))}
{[...Array(halfStars)].map((_, index) => (
<span key={`h-${index}`} className="fa fa-star-half-o" />
))}
{[...Array(emptyStars)].map((_, index) => (
<span key={`o-${index}`} className="fa fa-star-o" />
))}
</div>
)
}https://stackoverflow.com/questions/56855142
复制相似问题