代码之家  ›  专栏  ›  技术社区  ›  Ed de Almeida

反应:HTML未正确呈现

  •  0
  • Ed de Almeida  · 技术社区  · 7 年前

    我有一个React组件,其主要目标是在将文章转换为HTML后,呈现存储的广告标记(.md文件) marked .

    Articles.js

    import React from 'react';
    import marked from 'marked';
    import './articles.css';
    
    export default class Articles extends React.Component {
    
      constructor(props) {
        super(props);
        this.state = {
          articles: [],
          last_article: ""
        }
      }
    
      componentWillMount() {
        fetch('/last_article', {
          headers: {
            'Accept': 'text/markdown'
          }
        })
        .then(res => res.text())
        .then(txt => marked(txt))
        .then(html => {
          this.setState({
            last_article: html
          });
        });
      }
    
      render() {
        return (
          <div className="articles">
            {this.state.last_article}
          </div>
        );
      }
    
    }
    

    后端工作正常 componentWillMount 获取正确的文本并进行完美的转换。但它呈现如下:

    enter image description here

    我不是React专家,以前从未遇到过这个问题。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Anurag Singh Bisht    7 年前

    dangerouslySetInnerHTML 方法如下所述。

    Go through this link to see the proper documentation about dangerouslySetInnerHTML and it's side effects

    class Articles extends React.Component {
    
      constructor(props) {
        super(props);
        this.state = {
          articles: [],
          last_article: ""
        }
      }
    
      componentWillMount() {
          this.setState({
            last_article: `<h1>Hello</h1>`
          });
        
      }
      
      getMarkdownText() {
        return { __html: this.state.last_article };
      }
    
      render() {
        return (
          <div className="articles" dangerouslySetInnerHTML={this.getMarkdownText()}/> 
          );
      }
    
    }
    
    ReactDOM.render(
      <Articles />,
      document.getElementById('root')
    )
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    
    <div id="root"></div>
        2
  •  1
  •   Forrest Collins    7 年前