私はFacebookのReactJSを扱うのに問題があります。私がajaxをしてHTMLデータを表示したいときはいつでも、ReactJSはそれをテキストとして表示します。 (下図参照)
データはjquery Ajaxの成功コールバック関数を介して表示されます。
$.ajax({
url: url here,
dataType: "json",
success: function(data) {
this.setState({
action: data.action
})
}.bind(this)
});
これをHTMLに変換する簡単な方法はありますか? ReactJSを使ってどのようにすればいいですか?
デフォルトでは、ReactはHTMLをエスケープして XSS(クロスサイトスクリプティング) を防ぎます。本当にHTMLをレンダリングしたい場合は、 dangerouslySetInnerHTML
プロパティを使用できます。
<td dangerouslySetInnerHTML={{__html: this.state.actions}} />
Reactは意図的に面倒な構文を強いるので、誤ってテキストをHTMLとしてレンダリングしてXSSバグを引き起こすことはありません。
これを達成するためのより安全な方法があります。これらのメソッドで ドキュメントは更新されました 。
その他の方法
最も簡単 - Unicodeを使用し、ファイルをUTF-8として保存し、charset
をUTF-8に設定します。
<div>{'First · Second'}</div>
より安全 - Javascript文字列内のエンティティにUnicode番号を使用します。
<div>{'First \u00b7 Second'}</div>
または
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
あるいは文字列とJSX要素が混在する配列。
<div>{['First ', <span>·</span>, ' Second']}</div>
ラストリゾート - dangerouslySetInnerHTML
を使用して生のHTMLを挿入します。
<div dangerouslySetInnerHTML={{__html: 'First · Second'}} />
milesj によって作成された Interweave を使用することをお勧めします。 HTMLを解析して安全にDOMに挿入するための独創的な手法であれば、その数を活用する驚異的なライブラリです。
Interweaveは、安全にHTMLをレンダリングし、属性をフィルタし、テキストをマッチャーで自動折り返し、絵文字をレンダリングするなどの反応ライブラリです。
使用例:
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
私はこのjsのいじるを見つけました。これはこんな感じ
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
Html-react-parserからParser()を使用することもできます。私は同じを使っています。 リンク 共有。
私はreact-html-parserと呼ばれるnpmパッケージを使い始める