【问题标题】:String as html in reactjsreactjs中的字符串作为html
【发布时间】:2014-06-29 10:59:35
【问题描述】:

我有一个函数可以返回几行 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>
  );
}

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

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

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

【问题讨论】:

    标签: javascript reactjs react-jsx


    【解决方案1】:

    所以我自己找到了答案: 我们需要使用dangerouslySetInnerHTML={{__html: badges} 来实现这个结果。

    所以:

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

    成功了。希望对您有所帮助。

    【讨论】:

    • 虽然使用dangerouslySetInnerHTML 确实有效,但我建议在这种情况下避免使用它,因为您可以控制标记。该属性以dangerously 开头是有原因的:这些徽章成为代码注入的载体。
    【解决方案2】:

    虽然使用dangerouslySetInnerHTML 确实有效,但我建议在这种情况下避免使用它,因为您可以控制标记。该属性以 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>
        );
    }
    

    【讨论】:

    • 很好的答案 :-) 我认为你的意思是让 classObj 值默认为 false,所以我只是翻转它们。
    • 原始代码总是分配“fa”和“fa-fw”类,这就是为什么在我的例子中它们被设置为truevar str = '&lt;h3&gt;&lt;span className="fa fa-fw '
    • 啊,我没注意到。不错:-)
    • 感谢您的回答。连我都觉得dangerouslySetInnerHTML不合适。
    • 您错过了span 的右尖括号。而且 Stackoverflow 不允许我进行单个字符编辑:|
    猜你喜欢
    • 2013-10-16
    • 2017-07-30
    • 1970-01-01
    • 2021-09-14
    • 2022-01-03
    相关资源
    最近更新 更多