5

我有一个返回几行 html 的函数,如下所示:

render: function() {
  var badges = user.get('achievements').badges.map(function(badge) {
    var str = '<h3><span className="fa fa-fw '

    switch(badge.id) {
    case '0':
      str += ('fa-briefcase"></span><small>' + badge.text + '</small></h3>')
      break;
    case '1':
      str += ('fa-shopping-cart"></span><small>' + badge.text + '</small></h3>')
      break;
    ...
    }

    return str;
  });

  return (
    <div className="pull-right">
      {badges}
    </div>
  );
}

执行此操作时,字符串将按原样呈现在页面上,作为文本:

<h3><span className="fa fa-fw fa-briefcase"></span><small>Visionary</small></h3><h3><span className="fa fa-fw fa-shopping-cart"></span><small>Active</small></h3><h3><span className="fa fa-fw fa-sitemap"></span><small>Lorem</small></h3><h3><span className="fa fa-fw fa-tasks"></span><small>Ipsum</small></h3><h3><span className="fa fa-fw fa-signal"></span><small>Dolor</small></h3><h3><span className="fa fa-fw fa-check-square"></span><small>Amet;</small></h3>

如何将其呈现为正确的 HTML?

4

2 回答 2

5

虽然 usingdangerouslySetInnerHTML确实有效,但我建议在这种情况下避免使用它,因为您可以控制标记。该属性始于dangerously一个原因:这些徽章现在是代码注入的载体。

render() {
    const BADGE_ID_TO_ICON_CLASS_NAME = {
      '0': 'fa-briefcase',
      '1': 'fa-shopping-cart',
      ...
    };

    return (
      <div className="pull-right">
        {user.get('achievements').badges.map(badge => (
          <h3 key={badge.id}>
            <span
              className={`fa fa-fw ${BADGE_ID_TO_ICON_CLASS_NAME[badge.id]}`}
            />
            <small>{badge.text}</small>
          </h3>
        ))}
      </div>
    );
}
于 2014-05-12T15:18:53.673 回答
3

于是我自己找到了答案:我们需要使用dangerouslySetInnerHTML={{__html: badges}来达到这个结果。

所以:

<div className="pull-right" dangerouslySetInnerHTML={{__html: badges}}></div>

成功了。希望能帮助到你。

于 2014-05-12T07:12:55.257 回答