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.

Antworten:


294

Sie können gefährlich SetInnerHTML verwenden , z

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

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

@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 :)


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.


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

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.

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.