当前位置: 首页 > 知识库问答 >
问题:

在React组件中将HTML字符串呈现为真实HTML

袁博
2023-03-14

以下是我尝试过的,以及它是如何出错的。

这个作品:

<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} />

这没有:

<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} />

description属性只是HTML内容的普通字符串。但是,由于某些原因,它被呈现为字符串,而不是HTML。

有什么建议吗?

共有3个答案

戚飞
2023-03-14

检查您试图附加到节点的文本是否没有像这样转义:

var prop = {
    match: {
        description: '&lt;h1&gt;Hi there!&lt;/h1&gt;'
    }
};

而不是这样:

var prop = {
    match: {
        description: '<h1>Hi there!</h1>'
    }
};

如果是转义,你应该从你的服务器端转换它。

该节点是文本的,因为是转义的

该节点是dom节点,因为未转义

璩正志
2023-03-14

我使用“react html解析器”

yarn add react-html-parser
import ReactHtmlParser from 'react-html-parser'; 

<div> { ReactHtmlParser (html_string) } </div>

npmjs.com来源

提升@okram的评论以获得更多关注:

从它的github描述:将HTML字符串直接转换为React组件,避免使用NPMJ的危险的HTML。com是将HTML字符串转换为React组件的实用程序。避免使用危险的HTML,并将标准HTML元素、属性和内联样式转换为它们的等价物。

蒋嘉颖
2023-03-14

this.props.match.description是字符串还是对象?如果它是一个字符串,它应该被转换为超文本标记语言。示例:

class App extends React.Component {

constructor() {
    super();
    this.state = {
      description: '<h1 style="color:red;">something</h1>'
    }
  }
  
  render() {
    return (
      <div dangerouslySetInnerHTML={{ __html: this.state.description }} />
    );
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

结果:http://codepen.io/ilanus/pen/QKgoLA?editors=1011

但是,如果描述为

​Object {
$$typeof: [object Symbol] {},
  _owner: null,
  key: null,
  props: Object {
    children: "something",
    style: "color:red;"
  },
  ref: null,
  type: "h1"
}

如果它是一个字符串,而您没有看到任何HTML标记,那么我看到的唯一问题就是错误的标记。。

使现代化

如果您正在处理超文本标记语言实体,您需要在将它们发送到危险的SetInnerHTML之前对它们进行解码,这就是为什么它被称为危险的:)

工作示例:

class App extends React.Component {

  constructor() {
    super();
    this.state = {
      description: '&lt;p&gt;&lt;strong&gt;Our Opportunity:&lt;/strong&gt;&lt;/p&gt;'
    }
  }

   htmlDecode(input){
    var e = document.createElement('div');
    e.innerHTML = input;
    return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
  }

  render() {
    return (
      <div dangerouslySetInnerHTML={{ __html: this.htmlDecode(this.state.description) }} />
    );
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

 类似资料:
  • 问题内容: 这是我尝试过的方法以及出现问题的方法。 这有效: 这不是: description属性只是HTML内容的普通字符串。但是由于某种原因,它呈现为字符串,而不是HTML。 问题答案: 检查您尝试追加到节点的文本是否没有像这样转义: 代替这个:

  • 问题内容: 我使用setState更新html的一部分,但发现未呈现新的更新html。这是js fiddle 代码: HTML: js: 我省略了从服务器更新html的部分,但结果是相同的。如何让状态字符串呈现? 问题答案: 使用注入HTML作为一个字符串做出反应(但请注意,阵营将无法在它的虚拟DOM使用这个标记): http://jsfiddle.net/5Y8r4/11/ 用于执行此操作的AP

  • 我正在集成一个非react第三方库,它在我的react应用程序中呈现自己的HTML。如何渲染我自己的react组件后加载到该HTML的DOM中。我尝试使用ReactDom.Render,它确实有效,但不在根上下文中。反复调用ReactDom.Render似乎也会导致性能问题。

  • 目前我正在开发一个新的外观和感觉,由于许多原因,我不得不从头开始,我现在最大的问题是在具有的组件中获取字符串的宽度和高度,以确定它应该在哪里绘制,我知道如何为普通文本获取它,但如果它呈现为html文本,该如何做??。 使用确实提供了纯文本所需的一切,但使用它来处理html时,它就像是纯文本一样,所以我尝试了并对视图对象图形的执行相同的操作,但仍然是相同的,而我想要的是绘制的文本的尺寸(差异很大,比

  • 问题内容: 我正在使用Node.js的Forms库(Forms),它将在后端为我呈现一个表单: 最后一行创建一个HTML块,如下所示: 基本上只是一长串HTML。然后,我尝试使用EJS和Express通过以下代码进行渲染: 但是在渲染HTML时,只是我上面发布的字符串,而不是实际的HTML(因此是我想要的一种形式)。有什么方法可以使用EJS将字符串呈现为实际的HTML?还是我必须使用类似Jade的

  • 本文向大家介绍vue实现在v-html的html字符串中绑定事件,包括了vue实现在v-html的html字符串中绑定事件的使用技巧和注意事项,需要的朋友参考一下 需求: 需要在v-html的html字符串的button中绑定点击事件,需要点击后做一些操作,必须渲染成html,但是渲染后的html里面写绑定事件的代码没有经过vue编译,所以事件无效。 解决办法: 在v-html同级元素中使用事件绑