Reactjs konvertiert HTML-String in jsx

212

Ich habe Probleme mit Facebooks ReactJS. Immer wenn ich Ajax mache und HTML-Daten anzeigen möchte, zeigt ReactJS diese als Text an. (Siehe Abbildung unten)

ReactJS-Render-String

Die Daten werden über die Erfolgsrückruffunktion der jquery Ajax angezeigt.

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

Geben Sie hier die Bildbeschreibung ein

Gibt es eine einfache Möglichkeit, dies in HTML umzuwandeln? Wie soll ich es mit ReactJS machen?

Peter Wateber
quelle

Antworten:

405

Standardmäßig maskiert React den HTML- Code , um XSS (Cross-Site Scripting) zu verhindern . Wenn Sie HTML wirklich rendern möchten, können Sie die dangerouslySetInnerHTMLEigenschaft verwenden:

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

React erzwingt diese absichtlich umständliche Syntax, damit Sie nicht versehentlich Text als HTML rendern und XSS-Fehler einführen.

Sophie Alpert
quelle
4
Diese Syntax wird auf der Homepage und im Tutorial gezeigt, aber ich habe gerade festgestellt, dass sie nirgendwo anders dokumentiert ist, also habe ich nur # 413 eingereicht , um sie zu beheben.
Sophie Alpert
Richtig! Ich habe dies bereits mit gefährliche
SetInnerHTML
Es lohnt sich, auf Nummer sicher zu gehen, um den Inhalt mithilfe der sanitizeFunktion aus dem dompurifynpm-Paket zu bereinigen, wenn Sie diese Informationen von einer externen API erhalten.
Barry Michael Doyle
77

Es gibt jetzt sicherere Methoden, um dies zu erreichen. Die Dokumente wurden mit diesen Methoden aktualisiert .

Andere Methoden

  1. Am einfachsten - Verwenden Sie Unicode, speichern Sie die Datei als UTF-8 und setzen Sie sie charsetauf UTF-8.

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

  2. Sicherer - Verwenden Sie die Unicode-Nummer für die Entität in einer Javascript-Zeichenfolge.

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

    oder

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

  3. Oder ein gemischtes Array mit Zeichenfolgen und JSX-Elementen.

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

  4. Letzter Ausweg - Fügen Sie rohes HTML mit ein dangerouslySetInnerHTML.

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

Brett DeWoody
quelle
15
Ich habe die Dokumentation fertig, aber über eine lange HTML-Zeichenfolge wie eine aus einem WYSIWYG-Editor? Ich kann nicht sehen, wie wir die 1., 2. oder 3. Methode
anwenden können
4
Ich stimme @eric zu. Was nützen die Methoden 1-3 für bereits maskierte Inhalte, die irgendwo gespeichert sind, z. B. eine Datenbank? Beachten Sie auch, dass Methode 4 - die einzige Methode - bedeutet, dass Sie keine untergeordneten Knoten hinzufügen können.
dvdplm
14
Jep. Diese Beispiele mit fest codierten "dynamischen" Inhalten machen wenig Sinn.
Regularmike
Dies ist mein innerHTML - "Anzeigen von Administratoren \ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; 10 \ u003c / b \ u003e von \ u003cb \ u003e13 \ u003c / b \ u003e insgesamt", während dies angezeigt wird - "Anzeigen Administratoren 1 - 10 von 13 insgesamt 13 ". Wenn ich versuche, gefährlich SetInnerHTML zu verwenden, bricht alles zusammen.
Vipin8169
36

Ich empfehle die Verwendung von Interweave, das von Milesj erstellt wurde . Es ist eine phänomenale Bibliothek, die eine Reihe von raffinierten Techniken verwendet, um HTML zu analysieren und sicher in das DOM einzufügen.

Interweave ist eine Reaktionsbibliothek zum sicheren Rendern von HTML, Filtern von Attributen, Autowrap-Text mit Matchern, Rendern von Emoji-Zeichen und vielem mehr.

  • Interweave ist eine robuste React-Bibliothek, die:
    • Rendern Sie HTML sicher, ohne gefährlichSetInnerHTML zu verwenden.
    • HTML-Tags sicher entfernen.
    • Automatischer XSS- und Einspritzschutz.
    • Bereinigen Sie HTML-Attribute mithilfe von Filtern.
    • Interpolieren Sie Komponenten mithilfe von Matchern.
    • Autolink-URLs, IPs, E-Mails und Hashtags.
    • Rendern Sie Emoji und Emoticon Zeichen.
    • Und vieles mehr!

Anwendungsbeispiel:

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
Arman Nisch
quelle
Könnten Sie bitte ein Anwendungsbeispiel angeben?
El Anonimo
1
@ ElAnonimo Ich habe ein Verwendungsbeispiel hinzugefügt. Hoffe das macht die Sache etwas klarer.
Arman Nisch
1
Dank einer Million ist Interweave genau das, was ich brauchte. Prost.
Nicholas Hamilton
1
Die Dokumentation hierfür ist nicht hilfreich. Außerdem habe ich es mit ein paar Zeilen HTML ausprobiert und hatte eine Seite voller Fehlermeldungen. Hat jemand Beispiele oder Ressourcen mit Dokumentation?
Tarun Kolla
8
npm i html-react-parser;

import Parser from 'html-react-parser';

<td>{Parser(this.state.archyves)}</td>
Donatas Kuskys
quelle
6

Ich fand diese Geige. das funktioniert so

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

Hassan Gilak
quelle
Leider funktioniert das Dokument beim Server-Rendering nicht.
Laurent Van Winckel
Es könnte sein, wenn Sie import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idk goodluck tun
Coty Embry
2

Sie können auch Parser () aus dem HTML-React-Parser verwenden. Ich habe das gleiche benutzt. Link geteilt.

Abhra Dey
quelle
2

Ich beginne mit dem npm-Paket namens react-html-parser

Dayan
quelle
1

Für diejenigen, die noch experimentieren, installiert npm den react-html-parser

Als ich es installierte, hatte es 123628 wöchentliche Downloads.

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>
letele
quelle
0

Sie können Folgendes verwenden, wenn Sie rohes HTML in React rendern möchten

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

Beispiel - Rendern

Test ist ein guter Tag

Panayiotis Georgiou
quelle