I\'m having trouble dealing with facebook\'s ReactJS. Whenever I do ajax and want to display an html data, ReactJS displays it as text. (See figure below)
The data is displayed through the success callback function of the jquery Ajax.
$.ajax({
url: url here,
dataType: \"json\",
success: function(data) {
this.setState({
action: data.action
})
}.bind(this)
});
Is there any easy way to convert this into html? How should I do it using ReactJS?
By default, React escapes the HTML to prevent XSS (Cross-site scripting). If you really want to render HTML, you can use the dangerouslySetInnerHTML
property:
<td dangerouslySetInnerHTML={{__html: this.state.actions}} />
React forces this intentionally-cumbersome syntax so that you don\'t accidentally render text as HTML and introduce XSS bugs.
There are now safer methods to accomplish this. The docs have been updated with these methods.
Other Methods
Easiest - Use Unicode, save the file as UTF-8 and set the charset
to UTF-8.
<div>{\'First · Second\'}</div>
Safer - Use the Unicode number for the entity inside a Javascript string.
<div>{\'First \\u00b7 Second\'}</div>
or
<div>{\'First \' + String.fromCharCode(183) + \' Second\'}</div>
Or a mixed array with strings and JSX elements.
<div>{[\'First \', <span>·</span>, \' Second\']}</div>
Last Resort - Insert raw HTML using dangerouslySetInnerHTML
.
<div dangerouslySetInnerHTML={{__html: \'First · Second\'}} />
i found this js fiddle. this works like this
function unescapeHTML(html) {
var escapeEl = document.createElement(\'textarea\');
escapeEl.innerHTML = html;
return escapeEl.textContent;
}
<textarea className=\"form-control redactor\"
rows=\"5\" cols=\"9\"
defaultValue={unescapeHTML(this.props.destination.description)}
name=\'description\'></textarea>
jsfiddle link
I recommend using Interweave created by milesj. Its a phenomenal library that makes use of a number if ingenious techniques to parse and safely insert HTML into the DOM.
Interweave is a react library to safely render HTML, filter
attributes, autowrap text with matchers, render emoji characters, and
much more.
- Interweave is a robust React library that can:
- Safely render HTML without using dangerouslySetInnerHTML.
- Safely strip HTML tags.
- Automatic XSS and injection protection.
- Clean HTML attributes using filters.
- Interpolate components using matchers.
- Autolink URLs, IPs, emails, and hashtags.
- Render Emoji and emoticon characters.
- And much more!
Usage Example:
import React from \'react\';
import { Markup } from \'interweave\';
const articleContent = \"<p><b>Lorem ipsum dolor laboriosam.</b> </p><p>Facere debitis impedit doloremque eveniet eligendi reiciendis <u>ratione obcaecati repellendus</u> culpa? Blanditiis enim cum tenetur non rem, atque, earum quis, reprehenderit accusantium iure quas beatae.</p><p>Lorem ipsum dolor sit amet <a href=\'#testLink\'>this is a link, click me</a> Sunt ducimus corrupti? Eveniet velit numquam deleniti, delectus <ol><li>reiciendis ratione obcaecati</li><li>repellendus culpa? Blanditiis enim</li><li>cum tenetur non rem, atque, earum quis,</li></ol>reprehenderit accusantium iure quas beatae.</p>\"
<Markup content={articleContent} /> // this will take the articleContent string and convert it to HTML markup. See: https://milesj.gitbook.io/interweave
You can also use Parser() from html-react-parser.
I have used the same. Link shared.
i start using npm package called react-html-parser