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?

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.


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'}} />


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

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>

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


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.


2

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


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>

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

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.