简体   繁体   English

如何避免危险地SetInnerHTML?

[英]How to avoid dangerouslySetInnerHTML?

I wrote a React component which renders rating and visualizes it with stars. 我编写了一个React组件,该组件呈现评级并用星标对其进行可视化。 But I had to use dangerouslySetInnerHTML for that. 但是我必须为此使用危险的SetInnerHTML。 How could I rewrite component with better code style and without dangerouslySetInnerHTML? 我该如何重写具有更好代码风格的组件,而又不必危险地设置SetInnerHTML? Thank you for any help. 感谢您的任何帮助。

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() }} />
    );
  }
}

You can render multiple elements with an array, rather than a string: 您可以使用数组而不是字符串来呈现多个元素:

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>
    );
  }
}

As Quentin and Emile pointed out, you can write this function in one line, like so: 正如Quentin和Emile所指出的,您可以在一行中编写此函数,如下所示:

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

I did something similar that also supported half-stars and showed “empty” stars for the remaining spots (eg 3.5 stars would show 3 full stars, 1 half star, and 1 empty star): 我做了类似的事情,也支持半星,并在其余位置显示“空”星(例如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>
  )
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将JSX组件与dangerouslySetInnerHTML结合使用 - How to combine JSX component with dangerouslySetInnerHTML 在React.js中包装HTML时避免使用危险地使用SetInnerHTML - Avoid using dangerouslySetInnerHTML when wrapping HTML in React.js 如何在危险的SetInnerHTML 内容中呈现反应组件? - How to Render a react component inside a dangerouslySetInnerHTML content? 如何使用 <Link /> 在dangerouslySetInnerHTML中的组件 - How to use <Link /> component inside dangerouslySetInnerHTML React:如何在dangerouslySetInnerHTML的img标签上添加onClick() - React: How to add onClick() on img tag of dangerouslySetInnerHTML 如何在 React 中使用 dangerouslySetInnerHTML 传递样式 - how to pass style using dangerouslySetInnerHTML in React 如何使用样式组件全局设置动态反应数据 (dangerouslySetInnerHTML) 的样式? - How to globally style dynamic react data (dangerouslySetInnerHTML) with styled-components? 如何在Enzyme测试中访问由dangerouslySetInnerHTML创建的实际呈现的HTML - How to access actual rendered HTML created by dangerouslySetInnerHTML in Enzyme tests 如何使用危险的SetInnerHTML加载内容来处理“多读或少读” - How to handle "read more or less" using dangerouslySetInnerHTML to load Content 如何在 React 中使用危险的 SetInnerHTML 解析 Jsx 字符串? - How to parse Jsx String with expressions using dangerouslySetInnerHTML in React?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM