HTML mit React Variable Statements (JSX) einfügen

203

Ich baue etwas mit React, wo ich HTML mit React Variables in JSX einfügen muss. Gibt es eine Möglichkeit, eine Variable wie diese zu haben:

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

und es einzufügen, um so zu reagieren, und hat es funktionieren?

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

und muss es den HTML wie erwartet einfügen? Ich habe nichts über eine Reaktionsfunktion gesehen oder gehört, die dies inline ausführen könnte, oder über eine Methode zum Parsen von Dingen, die dies ermöglichen würden.

Kyle Hotchkiss
quelle

Antworten:

294

Sie können gefährlich SetInnerHTML verwenden , z

render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: thisIsMyCopy}}></div>
    );
}
Douglas
quelle
2
Wie funktioniert das, wenn Sie etwas hinzufügen müssen <head>?
Danielle Madeley
Normale DOM-Methoden in componentDidMount sollten funktionieren, ich habe es jedoch noch nicht getan.
Douglas
@DanielleMadeley Versuchen Sie, bedingte IE-Kommentare in <head> einzufügen? Wenn ja, hatte ich Erfolg mit dem hier beschriebenen Trick: nemisj.com/conditional-ie-comments-in-react-js
Cam Jackson
3
Stellen Sie sicher, dass Sie eine Methode an gefährliche SetInnerHTML und keinen Hash übergeben. Laut den Dokumenten ist es gefährlich, nur einen Hash zu übergeben. Referenz: facebook.github.io/react/tips/dangerously-set-inner-html.html
Criticerz
1
Gibt es einen Weg ohne das div einzufügen?
Alter
101

Beachten Sie, dass dangerouslySetInnerHTMLdies gefährlich sein kann, wenn Sie nicht wissen, was in der HTML-Zeichenfolge enthalten ist, die Sie einfügen. Dies liegt daran, dass bösartiger clientseitiger Code über Skript-Tags eingefügt werden kann.

Es ist wahrscheinlich eine gute Idee, die HTML-Zeichenfolge über ein Dienstprogramm wie DOMPurify zu bereinigen, wenn Sie nicht 100% sicher sind, dass der von Ihnen gerenderte HTML- Code XSS-sicher (Cross-Site Scripting) ist.

Beispiel:

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>
    );
}
Yo Wakita
quelle
@vsync nein sollte es nicht :)
Artem Bernatskyi
1
ist es möglich, nicht nur HTML-Tags zu rendern, sondern auch Tags aus der Bibliothek wie Material ui Alert-Tags. Ich möchte, dass der Code so istimport 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, Hast du eine Lösung für dieses Szenario bekommen?
Nimish Goel
51

gefährlichSetInnerHTML hat viele Nachteile, weil es innerhalb des Tags gesetzt wird.

Ich schlage vor, dass Sie einen React Wrapper verwenden, wie ich ihn hier auf npm für diesen Zweck gefunden habe. Der HTML-React-Parser erledigt den gleichen Job.

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>
    );
}

Sehr einfach :)

user2903536
quelle
3
"gefährlichSetInnerHTML hat viele Nachteile, weil es innerhalb des Tags gesetzt wird." Können Sie uns mehr dazu erklären? Der Versuch herauszufinden, welchen grundlegenden Unterschied es zwischen HTML-React-Parser und sanatisiertem InnerHtml gibt
Dchhetri
Es scheint, dass HTML-React-Parser die Eingabe nicht bereinigt - siehe die FAQ
Little Brain
28

Mit verwenden ''Sie es zu String. Verwenden Sie ohne Anführungszeichen funktioniert es gut.

iamnotbatma
quelle
14
Zuerst habe ich gelacht und dann eine Chance gegeben, die mich umgehauen hat
M am
1
Bei weitem die einfachste Antwort, insbesondere wenn der HTML-Code von Ihnen geschrieben und basierend auf Benutzereingaben dynamisch ist. Sie können var myHtml = <p> buchstäblich Text </ p> setzen; und es funktioniert
pat8719
1
Dies ist die beste Antwort. Danke, Kumpel!
Andy Mercer
3

Um Linterfehler zu vermeiden, verwende ich es folgendermaßen:

  render() {
    const props = {
      dangerouslySetInnerHTML: { __html: '<br/>' },
    };
    return (
        <div {...props}></div>
    );
  }
Tudor Morar
quelle
3
import { Fragment } from 'react' // react version > 16.0

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

Wenn Sie '' verwenden, wird der Wert auf eine Zeichenfolge gesetzt, und React kann nicht erkennen, dass es sich um ein HTML-Element handelt. Sie können Folgendes tun, um React wissen zu lassen, dass es sich um ein HTML-Element handelt:

  1. Entfernen Sie die ''und es würde funktionieren
  2. Verwenden Sie <Fragment>diese Option , um ein HTML-Element zurückzugeben.
Amandeep Singh Ghai
quelle
2
Dies beantwortet die Frage nicht. Der Inhalt von thisIsMyCopyist selbst JSX, keine HTML-Zeichenfolge. Sie fügen JSX also buchstäblich in JSX ein.
Antares42
Sie können Fragmente auch im Preact finden, jedoch nur in Version X und höher.
Nasia Makrygianni
-3

Wenn noch jemand hier landet. Mit ES6 können Sie Ihre HTML-Variable folgendermaßen erstellen:

render(){
    var thisIsMyCopy = (
        <p>copy copy copy <strong>strong copy</strong></p>
    );
    return(
        <div>
            {thisIsMyCopy}
        </div>
    )
}
Harry
quelle
2
und wenn Sie Variablen in Ihrer Zeichenfolge haben möchten, müssen Sie jede {}und die gesamte Zeichenfolge in ein Markup wie dieses (<span>{telephoneNumber} <br /> {email}</span>)
einschließen
2
Dies unterscheidet sich von dem, was in der Frage gestellt wird. In der Frage <p>copy copy copy <strong>strong copy</strong></p>ist eine Zeichenfolge. Sie haben es als JSX.
YPCrumble
4
Das ist nicht ES6, sondern JSX
Gztomas
-3

Sie können diesen HTML-Code auch wie folgt in ReactDOM aufnehmen:

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

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

Hier sind zwei Links Link und Link2 aus der React-Dokumentation, die hilfreich sein könnten.

Wiese
quelle