Reactjs converte la stringa html in jsx


212

Ho problemi a gestire ReactJS di Facebook. Ogni volta che faccio Ajax e voglio visualizzare un dato HTML, ReactJS lo visualizza come testo. (Vedi figura sotto)

ReactJS rende la stringa

I dati vengono visualizzati tramite la funzione di callback riuscita di jquery Ajax.

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

inserisci qui la descrizione dell'immagine

C'è un modo semplice per convertire questo in HTML? Come dovrei farlo usando ReactJS?

Risposte:


406

Per impostazione predefinita, React esegue l'escape dell'HTML per impedire XSS (cross-site scripting) . Se vuoi veramente rendere l'HTML, puoi usare la dangerouslySetInnerHTMLproprietà:

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

React impone questa sintassi volutamente ingombrante in modo da non rendere accidentalmente il testo come HTML e introdurre bug XSS.


4
Questa sintassi è mostrata sulla homepage e nel tutorial, ma ho appena realizzato che non è documentato da nessun'altra parte, quindi ho appena archiviato il numero 413 da correggere.
— Sophie Alpert,

Corretta! Ho già risolto questo problema usando pericolosamenteSetInnerHTML ma grazie comunque :)
— Peter Wateber,

Vale la pena giocare in modo sicuro per disinfettare il contenuto usando la sanitizefunzione dal dompurifypacchetto npm se si ottengono tali informazioni da un'API esterna.
— Barry Michael Doyle,

77

Ora ci sono metodi più sicuri per raggiungere questo obiettivo. I documenti sono stati aggiornati con questi metodi.

Altri metodi

  1. Più semplice : utilizzare Unicode, salvare il file come UTF-8 e impostare charsetUTF-8.

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

  2. Più sicuro : utilizzare il numero Unicode per l'entità all'interno di una stringa Javascript.

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

    o

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

  3. O un array misto con stringhe ed elementi JSX.

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

  4. Last Resort : inserisci HTML non elaborato utilizzando dangerouslySetInnerHTML.

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


15
Ho preparato la documentazione ma su una lunga stringa HTML come quella di un editor WYSIWYG? Non riesco a vedere come possiamo usare il 1o, 2o o 3o metodo
— ericn

4
Sono d'accordo con @eric. A che cosa servono i metodi 1-3 per i contenuti già sottoposti a escape memorizzati da qualche parte, ad esempio un DB? Si noti inoltre che il metodo 4 - l'unico metodo - significa che non è possibile aggiungere nodi figlio.
— dvdplm,

14
Sì. Questi esempi con contenuti "dinamici" codificati non hanno molto senso.
— regularmike,

Questo è il mio innerHTML - "Visualizzazione amministratori \ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; 10 \ u003c / b \ u003e di \ u003cb \ u003e13 \ u003c / b \ u003e in totale" mentre questo è ciò che viene visualizzato - "Visualizzazione amministratori <b> 1 & nbsp; - & nbsp; 10 </b> di <b> 13 </b> in totale ". Quando provo a usare pericolosamenteSetInnerHTML, tutto si rompe.
— vipin8169,

36

Consiglio di usare Interweave creato da milesj . È una libreria fenomenale che utilizza un numero se tecniche ingegnose per analizzare e inserire in modo sicuro HTML nel DOM.

Interweave è una libreria di reazioni per il rendering HTML, gli attributi di filtro, il testo automatico con gli abbinamenti, il rendering di caratteri emoji e molto altro.

  • Interweave è una solida libreria di React che può:
    • Esegui il rendering HTML in modo sicuro senza usare pericolosamenteSetInnerHTML.
    • Spoglia in modo sicuro i tag HTML.
    • Protezione automatica XSS e iniezione.
    • Pulisci gli attributi HTML usando i filtri.
    • Interpolare i componenti utilizzando i corrispondenti.
    • Collegamento automatico di URL, IP, e-mail e hashtag.
    • Rendering di personaggi Emoji ed emoticon.
    • E altro ancora!

Esempio di utilizzo:

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

Potresti fornire un esempio di utilizzo, per favore?
— El Anonimo,

1
@ElAnonimo Ho aggiunto un esempio di utilizzo. Spero che questo renda le cose un po 'più chiare.
— Arman Nisch,

1
Grazie mille, l'intreccio è esattamente ciò di cui avevo bisogno. Saluti.
— Nicholas Hamilton,

1
La documentazione per questo non è utile. Inoltre ho provato con poche righe di html e avevo una pagina piena di messaggi di errore. Qualcuno ha esempi o risorse con documentazione?
— Tarun Kolla,

8
npm i html-react-parser;

import Parser from 'html-react-parser';

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

6

ho trovato questo violino js. funziona così

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>

collegamento jsfiddle


Sfortunatamente il documento non funziona sul rendering del server.
— Laurent Van Winckel,

Potrebbe import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;succedere se lo fai con idk goodluck
— Coty Embry il

2

Puoi anche usare Parser () da html-reazioni-parser. Ho usato lo stesso. Link condiviso.


2

comincio a usare il pacchetto npm chiamato reazioni-html-parser


1

Per coloro che stanno ancora sperimentando, npm installa React-html-parser

Quando l'ho installato ha avuto 123628 download settimanali.

import ReactHtmlParser from 'react-html-parser'

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

0

È possibile utilizzare quanto segue se si desidera eseguire il rendering di HTML html in React

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

Esempio: rendering

Il test è una buona giornata

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.