首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免dangerouslySetInnerHTML?

如何避免dangerouslySetInnerHTML?
EN

Stack Overflow用户
提问于 2019-07-02 14:53:48
回答 2查看 1K关注 0票数 2

我写了一个反应组件,它呈现评级和可视化它与星星。但我不得不使用dangerouslySetInnerHTML。如果没有dangerouslySetInnerHTML,我怎么能用更好的代码风格重写组件?谢谢你的帮助。

代码语言:javascript
复制
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() }} />
    );
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-02 14:56:05

可以使用数组而不是字符串呈现多个元素:

代码语言:javascript
复制
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所指出的,您可以将此函数写成一行,如下所示:

代码语言:javascript
复制
renderStars = () => Array(5).fill(0).map(_, i => <div className={`fa fa-star${this.props.rating > i ? ' checked' : ''}`}/>)
票数 8
EN

Stack Overflow用户

发布于 2019-07-02 15:13:27

我做了一些类似的事情,也支持半星,并为剩下的点显示“空”星(例如3.5颗星显示3颗满号星、1颗半星和1颗空星):

代码语言:javascript
复制
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>
  )
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56855142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档