如何避免危险地SetInnerHTML?

Ser*_*rev 2 javascript reactjs

我编写了一个React组件,该组件呈现评级并用星标对其进行可视化。但是我必须为此使用危险的SetInnerHTML。我该如何重写具有更好代码风格的组件,而又不必危险地设置SetInnerHTML?感谢您的任何帮助。

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() }} />
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Kob*_*obe 8

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

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>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

正如Quentin和Emile所指出的,您可以在一行中编写此函数,如下所示:

renderStars = () => Array(5).fill(0).map(_, i => <div className={`fa fa-star${this.props.rating > i ? ' checked' : ''}`}/>)
Run Code Online (Sandbox Code Playgroud)

  • 或`()=&gt;(new Array(5))。fill(true).map((x,i)=&gt;(&lt;div class =“ fa fa-star {i &lt;this.props.rating?“ checked” :“”}“&gt; &lt;/ div&gt;)) (2认同)
  • Quentin评论中的JSX格式不正确,但该概念仍然是最佳的。``&lt;div className = {`fa fa-star $ {i &lt;this.props.rating?'checked':''}`} /&gt;'' (2认同)