最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Convert string to real HTML in React.js - Stack Overflow

programmeradmin3浏览0评论

I received information from an API which es with HTML. What happens is, when I try to display the information in the code, it transforms the HTML in a string and doesn't read as real HTML.
I search a lot and all I saw was the method of dangerouslySetInnerHTML but I also saw some reviews and ments about it and I don't want to use it if exists another solution. Also, I tried to use Fragmant but not success.

Below is my render() code:

return (
  <div>
    {models.map(model => (
      <a href="/sofa">
        <div className="Parcelas" key={model.id}>
          <img
            src={"url" + model.image}
            className="ParcImage"
            alt="sofa"
          />
          <h1>Sofá {model.name}</h1>
          <h2>
            1,200<span>€</span>
          </h2>

          <p className="Features">{model.description}</p>

          <button className="Botao">
            <p className="MostraDepois">Ver Detalhes</p>
            <span>+</span>
          </button>
          <img src="../../img/points.svg" className="Decoration" alt="points" />
        </div>
      </a>
    ))}
  </div>
);

Here's an image showing:

I received information from an API which es with HTML. What happens is, when I try to display the information in the code, it transforms the HTML in a string and doesn't read as real HTML.
I search a lot and all I saw was the method of dangerouslySetInnerHTML but I also saw some reviews and ments about it and I don't want to use it if exists another solution. Also, I tried to use Fragmant but not success.

Below is my render() code:

return (
  <div>
    {models.map(model => (
      <a href="/sofa">
        <div className="Parcelas" key={model.id}>
          <img
            src={"url" + model.image}
            className="ParcImage"
            alt="sofa"
          />
          <h1>Sofá {model.name}</h1>
          <h2>
            1,200<span>€</span>
          </h2>

          <p className="Features">{model.description}</p>

          <button className="Botao">
            <p className="MostraDepois">Ver Detalhes</p>
            <span>+</span>
          </button>
          <img src="../../img/points.svg" className="Decoration" alt="points" />
        </div>
      </a>
    ))}
  </div>
);

Here's an image showing:

Share Improve this question edited Aug 13, 2018 at 15:51 soalrib asked Jul 26, 2018 at 8:57 soalribsoalrib 5993 gold badges9 silver badges32 bronze badges 4
  • Could you give us more information, like how you models object looks like or an example screenshot? – MaddEye Commented Jul 26, 2018 at 9:07
  • @MaddEye I edited the question – soalrib Commented Jul 26, 2018 at 9:11
  • Did you find a safe solution for this? Some threads have suggested libraries but they don't mention anything about the safety. – Omar Commented Oct 9, 2019 at 5:55
  • I've used the solution below that Tholle talked about. Idk about security honestly @Omar – soalrib Commented Oct 10, 2019 at 14:00
Add a ment  | 

2 Answers 2

Reset to default 9

If you have html in a string, you can use dangerouslySetInnerHTML to render it as html.

return (
  <div>
    {models.map(model => (
      <a href="/sofa">
        <div className="Parcelas" key={model.id}>
          <img
            src={"url" + model.image}
            className="ParcImage"
            alt="sofa"
          />
          <h1>Sofá {model.name}</h1>
          <h2>
            1,200<span>€</span>
          </h2>

          <p
            className="Features"
            dangerouslySetInnerHTML={{ __html: model.description }}
          />

          <button className="Botao">
            <p className="MostraDepois">Ver Detalhes</p>
            <span>+</span>
          </button>
          <img src="../../img/points.svg" className="Decoration" alt="points" />
        </div>
      </a>
    ))}
  </div>
);

Check if the text you're trying to append to the node is no escaped like this:

model: {
  description: '&lt;h1&gt;Hi there!&lt;/h1&gt;'
}

Instead of this:

model: {
  description: '<h1>Hi there!</h1>'
}

if is escaped you should convert it from your server-side.

if you can't try something like this:

<p className="Features">{model.description.fromCharCode(183)}</p>

Another option is a bination of ReactHtmlParser and unescapingHtml:

import ReactHtmlParser from "react-html-parser";

let model = [
  {
    description: "<h1>Hello There</h1>"
  },
  {
    description: "&lt;h1&gt;Hello There&lt;/h1&gt;"
  }
];

function App() {
  function unescapeHTML(html) {
    var escapeEl = document.createElement("textarea");
    escapeEl.innerHTML = html;
    return escapeEl.textContent;
  }

  return (
    <div className="App">
      {model.map(des => {
        return ReactHtmlParser(unescapeHTML(des.description));
      })}
    </div>
  );
}
发布评论

评论列表(0)

  1. 暂无评论