Rendern von rohem HTML mit Reactjs

Lesezeit: 7 Minuten

Rendern von rohem HTML mit Reactjs
Weinjunge

Ist dies also die einzige Möglichkeit, rohes HTML mit Reactjs zu rendern?

// http://facebook.github.io/react/docs/tutorial.html
// tutorial7.js
var converter = new Showdown.converter();
var Comment = React.createClass({
  render: function() {
    var rawMarkup = converter.makeHtml(this.props.children.toString());
    return (
      <div className="comment">
        <h2 className="commentAuthor">
          {this.props.author}
        </h2>
        <span dangerouslySetInnerHTML={{__html: rawMarkup}} />
      </div>
    );
  }
});

Ich weiß, dass es einige coole Möglichkeiten gibt, Dinge mit JSX zu markieren, aber ich bin hauptsächlich daran interessiert, rohes HTML (mit allen Klassen, Inline-Stilen usw.) rendern zu können. So etwas Kompliziertes:

<!-- http://getbootstrap.com/components/#dropdowns-example -->
<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
    Dropdown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
  </ul>
</div>

Ich möchte das alles nicht in JSX neu schreiben müssen.

Vielleicht denke ich da ganz falsch. Bitte korrigieren Sie mich.

  • Das ist fast JSX. Wenn Sie viel Markup als reines HTML rendern, verlieren Sie den Vorteil einer Bibliothek wie React. Ich würde empfehlen, die kleinen Änderungen (wie “class” -> “className”) vorzunehmen, damit React die Elemente handhaben kann.

    – Ross Allen

    14. Januar 2015 um 6:03 Uhr

  • Für dieses spezielle Beispiel hat jemand schon die Arbeit für Sie erledigtaber die Frage steht immer noch für den allgemeinen Fall.

    – Randy Morris

    14. Januar 2015 um 12:07 Uhr

  • medium.com/@to_pe/…

    – TechDog

    23. November 2017 um 16:04 Uhr

  • HTML zu JSX konvertieren: transform.tools/html-to-jsx

    – Lasor

    22. Februar 2021 um 23:12 Uhr

1645917911 247 Rendern von rohem HTML mit Reactjs
Brett DeWoody

Es gibt jetzt sicherere Methoden zum Rendern von HTML. Ich habe dies in einer früheren Antwort hier behandelt. Sie haben 4 Möglichkeiten, die letzten verwendet dangerouslySetInnerHTML.

Methoden zum Rendern von HTML

  1. Am einfachsten – Verwenden Sie Unicode, speichern Sie die Datei als UTF-8 und legen Sie die charset zu UTF-8.

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

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

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

    oder

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

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

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

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

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

  • frage mich, was andere Attribute erhält dangerouslySetInnerHTML außer __html

    – Juan Solano

    12. April 2019 um 16:25 Uhr

  • @JuanSolano keine, laut den Auto-Complete-Einträgen in einer TypeScript-Umgebung.

    – Andreas Linnert

    17. Februar 2020 um 12:44 Uhr

  • In einer ähnlichen Frage, stackoverflow.com/questions/19266197/…, war diese Antwort nicht allzu gut. Vielleicht passt es besser zu dieser Frage oder vielleicht lesen die Leute die Antwort nicht … : D

    – 425nesp

    18. Mai 2020 um 1:45 Uhr

  • Die Leute geraten in Bezug auf DangerousSetInnerHtml aus der Form. Während Entwickler verstehen sollten, wie es geht möglicherweise ein Vektor für XSS-Angriffe ist, gibt es gültige Anwendungsfälle, in denen dies der vernünftige pragmatische Ansatz ist, insbesondere in Fällen, in denen das HTML, das Sie festlegen, nicht aus Benutzereingaben oder aus bereinigten Benutzereingaben gebildet wird. Wenn Sie HTML kennen und einen Grund haben, es in einer Variablen oder so zu speichern, ist dies bei weitem die eleganteste Methode.

    – hurlbz

    8. Mai 2021 um 0:24 Uhr


Rendern von rohem HTML mit Reactjs
Mike Nikles

Sie könnten die nutzen html-to-react npm-Modul.

Hinweis: Ich bin der Autor des Moduls und habe es erst vor wenigen Stunden veröffentlicht. Bitte zögern Sie nicht, Fehler oder Probleme mit der Benutzerfreundlichkeit zu melden.

  • verwendet es intern DangerlySetInnerHTML?

    – Yash Sharma

    13. Juni 2018 um 10:44 Uhr

  • Ich habe gerade den Code überprüft. Es scheint nicht gefährlich SetInnerHTML zu verwenden.

    – Ajay Raghav

    11. Juni 2019 um 6:49 Uhr

  • Mike, betreust du dieses npm-Modul immer noch aktiv?

    – Daniel

    11. Juli 2019 um 17:05 Uhr

  • Hey Daniel, ich weiß es nicht und einer der Mitwirkenden hat es übernommen und die letzte Version vor 7 Monaten veröffentlicht. Sehen github.com/aknuds1/html-to-react

    – Mike Nikles

    11. Juli 2019 um 17:42 Uhr

  • Dies ist aufgebläht und verwendet Ramda usw. und große Bibliotheken – ich empfehle es nicht

    – Evanjmg

    30. September 2020 um 14:49 Uhr


gefährlichSetInnerHTML ist Reacts Ersatz für die Verwendung von innerHTML im Browser-DOM. Im Allgemeinen ist das Festlegen von HTML aus Code riskant, da Ihre Benutzer leicht versehentlich einem Cross-Site-Scripting-Angriff (XSS) ausgesetzt werden können.

Es ist besser/sicherer, Ihr rohes HTML zu bereinigen (z. B. mit DOMPurify), bevor Sie es in das DOM über injizieren dangerouslySetInnerHTML.

DOMreinigen – ein DOM-exklusiver, superschneller, übertoleranter XSS-Reiniger für HTML, MathML und SVG. DOMPurify arbeitet mit einem sicheren Standard, bietet aber viele Konfigurierbarkeiten und Hooks.

Beispiel:

import React from 'react'
import createDOMPurify from 'dompurify'
import { JSDOM } from 'jsdom'

const window = (new JSDOM('')).window
const DOMPurify = createDOMPurify(window)

const rawHTML = `
<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
    Dropdown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
  </ul>
</div>
`

const YourComponent = () => (
  <div>
    { <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(rawHTML) }} /> }
  </div>
)

export default YourComponent

  • Das ist genau das, wonach ich in dieser Antwort gesucht habe. Es sollte mehr Upvotes haben

    – lamerr

    20. Mai 2020 um 12:30 Uhr

  • Danke dafür. Dies sollte die richtige Antwort sein.

    – College-Code

    6. Januar 2021 um 3:25 Uhr

  • Dies ist der Ansatz, den ich in Betracht ziehen könnte – Danke!

    – Wladyn

    4. April 2021 um 10:41 Uhr

  • Ich habe dies ohne JSDOM verwendet. Es funktionierte wie ein Zauber. Danke! Als ich diesen Thread las, wurde mir klar, wie anfällig für XSS-Angriffe eine Web-App mit einem CMS für technisch nicht versierte Personen sein könnte.

    – Wladyn

    6. April 2021 um 9:06 Uhr

  • Verdammt! Danke Yuci! Diese Antwort sollte berücksichtigt und akzeptiert werden.

    – Agent K

    2. Juli 2021 um 15:55 Uhr

1645917913 202 Rendern von rohem HTML mit Reactjs
Cory Robinson

Ich habe dies in schnellen und schmutzigen Situationen verwendet:

// react render method:

render() {
    return (
      <div>
        { this.props.textOrHtml.indexOf('</') !== -1
            ? (
                <div dangerouslySetInnerHTML={{__html: this.props.textOrHtml.replace(/(<? *script)/gi, 'illegalscript')}} >
                </div>
              )
            : this.props.textOrHtml
          }

      </div>
      )
  }

Ich habe diese reine Komponente ausprobiert:

const RawHTML = ({children, className = ""}) => 
<div className={className}
  dangerouslySetInnerHTML={{ __html: children.replace(/\n/g, '<br />')}} />

Merkmale

  • Dauert classNameRequisite (einfacher zu stylen)
  • Ersetzt \n zu <br /> (das will man oft machen)
  • Inhalt platzieren als Kinder bei Verwendung der Komponente wie:
  • <RawHTML>{myHTML}</RawHTML>

Ich habe die Komponente in einem Gist bei Github platziert: RawHTML: Reine ReactJS-Komponente zum Rendern von HTML

Rendern von rohem HTML mit Reactjs
Jozcar

export class ModalBody extends Component{
    rawMarkup(){
        var rawMarkup = this.props.content
        return { __html: rawMarkup };
    }
    render(){
        return(
                <div className="modal-body">
                     <span dangerouslySetInnerHTML={this.rawMarkup()} />

                </div>
            )
    }
}

ich benutzte diese Bibliothek namens Parser. Es funktionierte für das, was ich brauchte.

import React, { Component } from 'react';    
import Parser from 'html-react-parser';

class MyComponent extends Component {
  render() {
    <div>{Parser(this.state.message)}</div>
  }
};

  • 21 KB (8 KB gzippt). Ich konnte das nicht für Browsercode rechtfertigen.

    – Peter Bengtsson

    30. Mai 2019 um 20:22 Uhr

  • Diese Bibliothek macht meine Expo-App kaputt

    – ekkis

    6. Februar 2020 um 2:11 Uhr

869400cookie-checkRendern von rohem HTML mit Reactjs

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy