在浏览器中呈现之前,React 似乎正在转义 HTML,导致它在页面中显示为代码

Posted

技术标签:

【中文标题】在浏览器中呈现之前,React 似乎正在转义 HTML,导致它在页面中显示为代码【英文标题】:React seems to be escaping HTML before rendering in the browser causing it to appear as code in the page 【发布时间】:2018-11-05 16:41:40 【问题描述】:

我有一个 React 类,渲染函数工作正常。 <li> 标签和内部 <a> 标签呈现。 但是,getListItem 返回的 html 字符串不会呈现。相反,它在页面上显示为代码,就好像它已被转义一样。 如何在 React 中防止这种行为,以便在创建组件时构建动态 HTML,如下面的(尝试的)示例中所示?

class ExchangeListItem extends Component 
  constructor(props) 
    super(props);
  this.state = 
    ;
  

  getListItem() 
    const retStr = '<a className="nav-link active" href="'+this.props.exchange.url+'">'+this.props.exchange.name + '</a>';
    return retStr;
  

  render() 
    return (
      <li>
        <a href="https://wwww.google.com">Link</a>
        this.getListItem()
      </li>
    );
  

这里的问题是 React 如何渲染某些东西。如果它是一个字符串,它将转义特殊字符并导致(在这种情况下)HTML 成为显示的文本。另一篇文章只是询问如何更改innerHTML。在我的例子中,我不是试图改变一个元素,而是试图让 React 首先呈现我想要的东西。

【问题讨论】:

是的,因为那是一个字符串而不是 JSX 虽然您的问题不是完全重复的,但您会在这个问题***.com/questions/37337289/… 找到答案(基本上,您正在寻找dangerouslysetInnerHTML 谢谢约翰,但我认为从渲染一个反应组件而不是 HTML 的角度来解决这个问题是最好的答案。问题不在于我是否可以影响所需的内容,而只是 React 对它的作用(它转义了在字符串中找到的 HTML,而不是渲染它),因此为它提供一个 React 对象可以很好地解决这个问题。 【参考方案1】:

在没有解析器的情况下,在 ES6 中执行此操作的另一种更简洁的方法是;

import React from 'react';

class ExchangeListItem extends React.Component 
  constructor(props) 
    super(props);
    this.state = ;
  

  getListItem = (exchangeUrl, exchangeName) => (
    <a className="nav-link active" href=exchangeUrl>
      exchangeName
    </a>
  );

  render() 
    return (
      <li>
        <a href="https://wwww.google.com">Link</a>
        this.getListItem(this.props.exchange.url, this.props.exchange.name)
      </li>
    );
  

【讨论】:

这很好,我能够删除下面列出的模块(react-html-parser 和 json-loader)【参考方案2】:

我总是使用react-html-parser 在组件中呈现 html 内容。

导入解析器

import ReactHtmlParser from 'react-html-parser';

在 getListItem 方法中使用它,如下所示

getListItem() 
  const retStr = '<a className="nav-link active" href="'+this.props.exchange.url+'">'+this.props.exchange.name + '</a>';
  return ReactHtmlParser(retStr);

编辑:

请注意,react-html-parser 是解析已经存储在变量中的 html 字符串。对于上述情况,在上一行中构造了 html 字符串,我们可以像任何 react 组件一样以 jsx 格式返回标签​​。

【讨论】:

非常感谢,这是完美的! 为了后代,我想补充一点,添加 react-html-parser 然后还需要 json-loader 因为我也在使用 webpack 版本

以上是关于在浏览器中呈现之前,React 似乎正在转义 HTML,导致它在页面中显示为代码的主要内容,如果未能解决你的问题,请参考以下文章

React:子组件在提交表单时不会重新呈现

React Context API似乎重新渲染每个组件

React App无法正确呈现

我怎么知道我是否在React路由器内部?

如何在React Native中获取数据之前呈现加载器

React 响应式 UI 不会在移动设备上以微小的文本呈现