Reactjsはhtml文字列をjsxに変換します


212

FacebookのReactJSの処理に問題があります。ajaxを実行してHTMLデータを表示したいときはいつでも、ReactJSはそれをテキストとして表示します。(下図参照)

ReactJSレンダー文字列

データは、jquery Ajaxの成功コールバック関数を介して表示されます。

$.ajax({
   url: url here,
   dataType: "json",
   success: function(data) {
      this.setState({
           action: data.action
      })
   }.bind(this)
});

ここに画像の説明を入力してください

これをhtmlに変換する簡単な方法はありますか?ReactJSを使用するにはどうすればよいですか?

回答:


405

デフォルトでは、ReactはHTMLをエスケープして、XSS(クロスサイトスクリプティング)を防ぎます。本当にHTMLをレンダリングしたい場合は、次のdangerouslySetInnerHTMLプロパティを使用できます。

<td dangerouslySetInnerHTML={{__html: this.state.actions}} />

Reactはこの意図的に煩雑な構文を強制するため、誤ってテキストをHTMLとしてレンダリングしたり、XSSバグを導入したりすることはありません。


4
この構文はホームページとチュートリアルに示されていますが、他に文書化されていないことに気付いたので、修正するために#413を提出しました。
ソフィーアルパート

正しい!これは既にdangerouslySetInnerHTMLを使用して解決しましたが、感謝します:)
Peter Wateber 2013年

外部APIから情報を取得している場合sanitizeは、dompurifynpmパッケージの関数を使用してコンテンツを無害化することは安全です。
バリーマイケルドイル

77

これを達成するためのより安全な方法があります。ドキュメントが更新されている、これらの方法で。

その他の方法

  1. 最も簡単-Unicodeを使用し、ファイルをUTF-8として保存し、UTF-8に設定しcharsetます。

    <div>{'First · Second'}</div>

  2. より安全 -JavaScript文字列内のエンティティにUnicode番号を使用します。

    <div>{'First \u00b7 Second'}</div>

    または

    <div>{'First ' + String.fromCharCode(183) + ' Second'}</div>

  3. または、文字列とJSX要素を含む混合配列。

    <div>{['First ', <span>&middot;</span>, ' Second']}</div>

  4. 最後の手段 -を使用して生のHTMLを挿入しますdangerouslySetInnerHTML

    <div dangerouslySetInnerHTML={{__html: 'First &middot; Second'}} />


15
ドキュメントの準備はできていますが、WYSIWYGエディターからのものなど、長いHTML文字列についてはどうですか?1番目、2番目、または3番目の方法をどのように使用できるかわかりません
ericn

4
@ericに同意します。すでにエスケープされたコンテンツ(DBなど)に格納されている方法1〜3はどのように役立ちますか?また、方法4(唯一の方法)は、子ノードを追加できないことを意味します。
dvdplm 2015

14
うん。ハードコーディングされた「動的」コンテンツを含むこれらの例は、あまり意味がありません。
regularmike

これは私のinnerHTMLです-"表示中の管理者\ u003cb \ u003e1 \ u0026nbsp;-\ u0026nbsp; 10 \ u003c / b \ u003e of \ u003cb \ u003e13 \ u003c / b \ u003e"これがレンダリングされているものです-"Displaying管理者<b> 1&nbsp;-&nbsp; 10 </ b> / <b> 13 </ b>合計。」dangerouslySetInnerHTMLを使用しようとすると、evrythingが壊れます。
vipin8169 2016年

36

milesjによって作成されたInterweaveの使用をお勧めします。HTMLを解析してDOMに安全に挿入するための巧妙な手法を採用した驚異的なライブラリーです。

Interweaveは、HTMLの安全なレンダリング、属性のフィルター、マッチャーによるテキストの自動折り返し、絵文字のレンダリングなどを行うための反応ライブラリーです。

  • Interweaveは、次のことができる堅牢なReactライブラリです。
    • dangerouslySetInnerHTMLを使用せずにHTMLを安全にレンダリングします。
    • HTMLタグを安全に削除します。
    • 自動XSSおよび注入保護。
    • フィルターを使用してHTML属性をクリーンアップします。
    • マッチャーを使用してコンポーネントを補間します。
    • 自動リンクURL、IP、メール、ハッシュタグ。
    • 絵文字と顔文字をレンダリングします。
    • そして、はるかに!

使用例:

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


//to install package using npm, execute the command
npm install interweave

使用例を教えていただけますか?
El Anonimo

1
@ElAnonimo使用例を追加しました。少しわかりやすくなるといいですね。
アルマンニッシュ2018

1
100万人に感謝、interweaveはまさに私が必要としていたものです。乾杯。
ニコラスハミルトン

1
このドキュメントは役に立ちません。また、数行のhtmlで試してみたところ、エラーメッセージで一杯のページが表示されました。誰かが例やドキュメント付きのリソースを持っていますか?
Tarun Kolla


6

私はこの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リンク


残念ながら、ドキュメントはサーバーのレンダリングでは機能しません。
Laurent Van Winckel

import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idkグッドラックを行うとよいかもしれません
Coty Embry


2

react-html-parserと呼ばれるnpmパッケージの使用を開始します


1

まだ実験中の人のために、npm install react-html-parser

インストールしたところ、毎週123628のダウンロードがありました。

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>

0

Reactで生のhtmlをレンダリングしたい場合は、以下を使用できます

<div dangerouslySetInnerHTML={{__html: `html-raw-goes-here`}} />

例-レンダリング

テストは良い日です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.