Reactjs konwertuje ciąg HTML na jsx


212

Mam problem z ReactJS na Facebooku. Ilekroć robię ajax i chcę wyświetlić dane HTML, ReactJS wyświetla je jako tekst. (Patrz rysunek poniżej)

Łańcuch renderowania ReactJS

Dane są wyświetlane przez funkcję wywołania zwrotnego jQuery Ajax.

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

wprowadź opis zdjęcia tutaj

Czy jest jakiś prosty sposób przekonwertować to na HTML? Jak mam to zrobić za pomocą ReactJS?

Odpowiedzi:


406

Domyślnie React ucieka z kodu HTML, aby zapobiec XSS (skryptom krzyżowym) . Jeśli naprawdę chcesz renderować HTML, możesz użyć dangerouslySetInnerHTMLwłaściwości:

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

React wymusza tę celowo nieporęczną składnię, aby przypadkowo nie renderować tekstu jako HTML i nie wprowadzać błędów XSS.


4
Ta składnia jest pokazana na stronie głównej iw samouczku, ale właśnie zdałem sobie sprawę, że nie jest to udokumentowane nigdzie indziej, więc po prostu zgłosiłem # 413 do naprawy.
Sophie Alpert,

Poprawny! Rozwiązałem to już za pomocą niebezpiecznieSetInnerHTML, ale dziękuję jednak :)
Peter Wateber 10.10.2013

Warto uzyskać bezpieczne odkażanie zawartości za pomocą sanitizefunkcji z dompurifypakietu npm, jeśli pobierasz te informacje z zewnętrznego interfejsu API.
Barry Michael Doyle

77

Istnieją teraz bezpieczniejsze metody osiągnięcia tego celu. Dokumenty zostały zaktualizowane przy użyciu tych metod.

Inne metody

  1. Najłatwiejszy - użyj Unicode, zapisz plik jako UTF-8 i ustaw na charsetUTF-8.

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

  2. Bezpieczniej - użyj numeru Unicode dla encji wewnątrz ciągu JavaScript.

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

    lub

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

  3. Lub tablica mieszana z ciągami znaków i elementami JSX.

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

  4. Last Resort - Wstaw surowy HTML za pomocą dangerouslySetInnerHTML.

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


15
Mam już dokumentację dotyczącą długiego łańcucha HTML, takiego jak edytor WYSIWYG? Nie rozumiem, jak możemy zastosować pierwszą, drugą lub trzecią metodę
ericn

4
Zgadzam się z @eric. Jakie korzyści mają metody 1-3 dla już uciekających treści przechowywanych gdzieś, np. DB? Zauważ też, że metoda 4 - jedyna metoda - oznacza, że ​​nie możesz dodać węzłów potomnych.
dvdplm,

14
Tak. Te przykłady z zakodowaną „dynamiczną” treścią nie mają większego sensu.
regularmike,

To jest mój innerHTML - „Wyświetlanie administratorów \ u003e1 \ u0026nbsp; - \ u0026nbsp; 10 \ u003c / b \ u003e z \ u003cb \ u003e13 \ u003c / b \ u003e ogółem? Podczas gdy to jest renderowane?? admins <b> 1 & nbsp; - & nbsp; 10 </b> z <b> 13 </b> łącznie ”. Kiedy próbuję użyć niebezpiecznieSetInnerHTML, wszystko się psuje.
vipin8169

36

Polecam przy użyciu Interweave stworzony przez milesj . Jest to fenomenalna biblioteka, która wykorzystuje wiele genialnych technik do analizowania i bezpiecznego wstawiania HTML do DOM.

Interweave to biblioteka reagująca do bezpiecznego renderowania HTML, filtrowania atrybutów, automatycznego zawijania tekstu za pomocą dopasowań, renderowania znaków emoji i wielu innych.

  • Interweave to solidna biblioteka React, która może:
    • Bezpiecznie renderuj HTML bez użycia niebezpiecznieSetInnerHTML.
    • Bezpiecznie usuwaj tagi HTML.
    • Automatyczna ochrona XSS i wtrysku.
    • Wyczyść atrybuty HTML za pomocą filtrów.
    • Interpoluj komponenty za pomocą dopasowań.
    • Automatycznie łącz adresy URL, adresy IP, e-maile i hashtagi.
    • Renderuj znaki Emoji i emotikony.
    • I wiele więcej!

Przykład użycia:

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

Czy możesz podać przykład użycia?
El Anonimo,

1
@ElAnonimo Dodałem przykład użycia. Mam nadzieję, że dzięki temu wszystko jest trochę jaśniejsze.
Arman Nisch

1
Dzięki milionowi, przeplatanie jest dokładnie tym, czego potrzebowałem. Twoje zdrowie.
Nicholas Hamilton

1
Dokumentacja tego nie jest pomocna. Wypróbowałem też z kilkoma liniami HTML i miałem stronę pełną komunikatów o błędach. Czy ktoś ma przykłady lub zasoby z dokumentacją?
Tarun Kolla

8
npm i html-react-parser;

import Parser from 'html-react-parser';

<td>{Parser(this.state.archyves)}</td>

6

znalazłem to skrzypce js. to działa w ten sposób

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>

link jsfiddle


Niestety dokument nie działa na renderowaniu serwera.
Laurent Van Winckel,

Może, jeśli zrobisz import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;idk goodluck
Coty Embry

2

Możesz także użyć Parser () z HTML-React-Parser. Użyłem tego samego. Link udostępniony.


2

zaczynam korzystać z pakietu npm o nazwie reaguj-HTML-parser


1

Dla tych, którzy wciąż eksperymentują, npm zainstaluj install-html-parser

Po zainstalowaniu miał 123628 pobrań tygodniowo.

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>

0

Możesz użyć poniższych, jeśli chcesz renderować surowy HTML w React

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

Przykład - Renderuj

Test to dobry dzień

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.