React Variableステートメントを使用してHTMLを挿入する(JSX)


203

JSXでReact変数を使用してHTMLを挿入する必要があるReactで何かを構築しています。そのような変数を持つ方法はありますか:

var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';

そしてそれをreactに挿入してそのように動作させますか?

render: function() {
    return (
        <div className="content">{thisIsMyCopy}</div>
    );
}

期待どおりにHTMLを挿入していますか?これをインラインで実行することができる反応関数、またはこれを機能させることを可能にするものを解析する方法について、私は何も見たり聞いたりしたことがありません。

回答:


295

例えば、dangerouslySetInnerHTMLを使用できます。

render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: thisIsMyCopy}}></div>
    );
}

2
これに何かを追加する必要がある場合、これはどのように機能し<head>ますか?
Danielle Madeley、2015年

componentDidMountの通常のDOMメソッドは機能するはずですが、以前は機能していません。
ダグラス

@DanielleMadeley <head>に条件付きのIEコメントを挿入しようとしていますか?もしそうなら、私はここで説明されているトリックを使用して成功しました:nemisj.com/conditional-ie-comments-in-react-js
Cam Jackson

3
必ずハッシュではなく、dangerouslySetInnerHTMLにメソッドを渡してください。ドキュメントによると、ハッシュを渡すだけでは危険です。リファレンス:facebook.github.io/react/tips/dangerously-set-inner-html.html
criticerz

1
divを挿入しない方法はありますか?
2018

102

dangerouslySetInnerHTML注入するHTML文字列の内容がわからない場合、危険になる可能性があることに注意してください。これは、悪意のあるクライアント側コードがスクリプトタグを介して挿入される可能性があるためです。

レンダリングするHTMLがXSS(クロスサイトスクリプティング)セーフであることが100%確実でない場合は、DOMPurifyなどのユーティリティを使用してHTML文字列をサニタイズすることをお勧めします。

例:

import DOMPurify from 'dompurify'

const thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';


render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div>
    );
}

@vsyncいいえ、それはすべきではありません:)
Artem

1
HTMLタグだけでなく、マテリアルUIアラートタグのようなライブラリからのタグをレンダリングすることは可能ですか?コードを次のようにしたいimport DOMPurify from 'dompurify' const thisIsMyCopy = '<Alert severity="warning">copy copy copy <strong>strong copy</strong></Alert >'; render: function() { return ( <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div> ); }
sasha romanov

@sasharomanov、このシナリオの解決策はありましたか?
ニミッシュゴール

51

dangerouslySetInnerHTMLはタグ内に設定されるため、多くの欠点があります。

この目的のために、ここでnpmにあるようなラッパーを使用することをお勧めします。 html-react-parserも同じ働きをします。

import Parser from 'html-react-parser';
var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';


render: function() {
    return (
        <div className="content">{Parser(thisIsMyCopy)}</div>
    );
}

非常にシンプル:)


3
「dangerouslySetInnerHTMLはタグ内に設定されるため、多くの欠点があります。」これについて詳しく説明してください。html-react-parserとサナタイズされたinnerHtmlの基本的な違いを考えてみる
dchhetri

html-react-parserは入力をサニタイズしないようです-FAQ
リトルブレイン

28

使用''することで紐になっています。逆コンマなしで使用すると問題なく動作します。


14
最初に私は笑って、それから私の心を
Mの

1
特にHTMLがユーザーによって記述され、ユーザー入力に基づいて動的である場合は、はるかに簡単な答えです。文字通り、var myHtml = <p> Some text </ p>を設定できます。そしてそれは機能します
pat8719

1
これが最良の答えです。どうも!
Andy Mercer

3

リンターエラーを回避するために、次のように使用します。

  render() {
    const props = {
      dangerouslySetInnerHTML: { __html: '<br/>' },
    };
    return (
        <div {...props}></div>
    );
  }

3
import { Fragment } from 'react' // react version > 16.0

var thisIsMyCopy = (
  <Fragment>
    <p>copy copy copy&nbsp;
    <strong>strong copy</strong>
    </p>
  </Fragment>
)

''を使用すると、値が文字列に設定され、ReactはそれがHTML要素であることを知る方法がありません。次のようにして、HTML要素であることをReactに知らせることができます-

  1. を削除します ''、それは動作します
  2. <Fragment>HTML要素を返すために使用します。

2
これは質問の答えにはなりません。のコンテンツthisIsMyCopy自体はJSXであり、HTMLの文字列ではありません。つまり、文字通りJSXをJSXに貼り付けています。
Antares42

フラグメントはPreactでも見つかりますが、バージョンX以降でのみ見つかります。
Nasia Makrygianni

-3

他の誰かがまだここに上陸した場合。ES6では、次のようにHTML変数を作成できます。

render(){
    var thisIsMyCopy = (
        <p>copy copy copy <strong>strong copy</strong></p>
    );
    return(
        <div>
            {thisIsMyCopy}
        </div>
    )
}

2
また、文字列内に変数が必要な場合は、それぞれの{}文字列と文字列全体をいくつかのマークアップで(<span>{telephoneNumber} <br /> {email}</span>)
囲む

2
これは、質問での質問とは異なります。問題<p>copy copy copy <strong>strong copy</strong></p>は文字列です。あなたはJSXとしてそれを持っています。
YPCrumble 2017

4
これはES6ではなく、JSXです
gztomas

-3

このHTMLを次のようにReactDOMに含めることもできます。

var thisIsMyCopy = (<p>copy copy copy <strong>strong copy</strong></p>);

ReactDOM.render(<div className="content">{thisIsMyCopy}</div>, document.getElementById('app'));

以下は、役立つかもしれないReactのドキュメントからの2つのリンクlinklink2です。

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