最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

javascript - React: HTML not rendering correctly - Stack Overflow

matteradmin4PV0评论

I have this React ponent whose main goal is to render an article stored ad MarkDown (.md file) after it is transformed into HTML by 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: ""
    }
  }

  ponentWillMount() {
    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>
    );
  }

}

The back-end works fine and ponentWillMount fetches the correct text and transforms it perfectly. But it renders like this:

I am not a React expert and never faced this problem before.

Any suggestions?

I have this React ponent whose main goal is to render an article stored ad MarkDown (.md file) after it is transformed into HTML by 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: ""
    }
  }

  ponentWillMount() {
    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>
    );
  }

}

The back-end works fine and ponentWillMount fetches the correct text and transforms it perfectly. But it renders like this:

I am not a React expert and never faced this problem before.

Any suggestions?

Share Improve this question asked Jul 31, 2017 at 5:40 Edvaldo Silva de Almeida JrEdvaldo Silva de Almeida Jr 3,7235 gold badges30 silver badges61 bronze badges 2
  • 2 Use dangerouslySetInnerHTML to render html. facebook.github.io/react/docs/dom-elements.html – Ved Commented Jul 31, 2017 at 5:45
  • What Ved said, was just about to post that. – Kyle Richardson Commented Jul 31, 2017 at 5:52
Add a ment  | 

2 Answers 2

Reset to default 5

Use the dangerouslySetInnerHTML approach as I have described below.

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: ""
    }
  }

  ponentWillMount() {
      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./ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare./ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

As others have said, dangerouslySetInnerHTML will work, but if you are going to find yourself doing this a lot, check out this cool lib.

Post a comment

comment list (0)

  1. No comments so far