Reactjs convertit une chaîne html en jsx

213

J'ai du mal à gérer le ReactJS de Facebook. Chaque fois que je fais ajax et que je veux afficher des données html, ReactJS les affiche sous forme de texte. (Voir figure ci-dessous)

Chaîne de rendu ReactJS

Les données sont affichées via la fonction de rappel de réussite du jquery Ajax.

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

entrez la description de l'image ici

Existe-t-il un moyen simple de convertir cela en html? Comment dois-je le faire en utilisant ReactJS?

Peter Wateber
la source

Réponses:

407

Par défaut, React échappe au HTML pour empêcher XSS (Cross-site scripting) . Si vous voulez vraiment rendre le HTML, vous pouvez utiliser la dangerouslySetInnerHTMLpropriété:

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

React force cette syntaxe intentionnellement lourde afin que vous ne rendiez pas accidentellement du texte au format HTML et n'introduisiez pas de bogues XSS.

Sophie Alpert
la source
4
Cette syntaxe est affichée sur la page d'accueil et dans le didacticiel, mais je viens de réaliser qu'elle n'est documentée nulle part ailleurs, j'ai donc déposé # 413 pour corriger.
Sophie Alpert
Correct! J'ai résolu ce problème en utilisant dangereusementSetInnerHTML mais merci cependant :)
Peter Wateber
Il vaut la peine de jouer en toute sécurité pour désinfecter le contenu à l'aide de la sanitizefonction du dompurifypackage npm si vous obtenez ces informations d'une API externe.
Barry Michael Doyle
77

Il existe désormais des méthodes plus sûres pour y parvenir. Les documents ont été mis à jour avec ces méthodes.

Autres méthodes

  1. Le plus simple : utilisez Unicode, enregistrez le fichier au format UTF-8 et réglez-le charsetsur UTF-8.

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

  2. Plus sûr - Utilisez le numéro Unicode pour l'entité à l'intérieur d'une chaîne Javascript.

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

    ou

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

  3. Ou un tableau mixte avec des chaînes et des éléments JSX.

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

  4. Last Resort - Insérez du HTML brut à l'aide de dangerouslySetInnerHTML.

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

Brett DeWoody
la source
15
J'ai prêté la documentation mais sur une longue chaîne HTML comme celle d'un éditeur WYSIWYG? Je ne vois pas comment nous pouvons utiliser la première, la deuxième ou la troisième méthode
Eric
4
Je suis d'accord avec @eric. À quoi servent les méthodes 1-3 pour le contenu déjà échappé stocké quelque part, par exemple une base de données? Notez également que la méthode 4 - la seule méthode - signifie que vous ne pouvez pas ajouter de nœuds enfants.
dvdplm
14
Ouaip. Ces exemples avec du contenu "dynamique" codé en dur n'ont pas beaucoup de sens.
regularmike
Ceci est mon innerHTML - "Affichage des administrateurs \ u003cb \ u003e1 \ u0026nbsp; - \ u0026nbsp; 10 \ u003c / b \ u003e de \ u003cb \ u003e13 \ u003c / b \ u003e au total" alors que c'est ce qui est rendu - "Affichage admins <b> 1 & nbsp; - & nbsp; 10 </b> sur <b> 13 </b> au total ". Lorsque j'essaie d'utiliser dangereusement SetInnerHTML, tout se brise.
vipin8169
36

Je recommande d'utiliser Interweave créé par milesj . C'est une bibliothèque phénoménale qui utilise un certain nombre de techniques ingénieuses pour analyser et insérer en toute sécurité du HTML dans le DOM.

Interweave est une bibliothèque React pour rendre en toute sécurité le HTML, filtrer les attributs, envelopper automatiquement le texte avec des égaliseurs, rendre les caractères emoji et bien plus encore.

  • Interweave est une bibliothèque React robuste qui peut:
    • Rendre HTML en toute sécurité sans utiliser dangerouslySetInnerHTML.
    • Supprimez les balises HTML en toute sécurité.
    • Protection automatique XSS et injection.
    • Nettoyez les attributs HTML à l'aide de filtres.
    • Interpoler les composants à l'aide d'apparieurs.
    • Lier automatiquement les URL, IP, e-mails et hashtags.
    • Rendre les caractères Emoji et émoticônes.
    • Et beaucoup plus!

Exemple d'utilisation:

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
la source
Pourriez-vous fournir un exemple d'utilisation s'il vous plaît?
El Anonimo
1
@ElAnonimo J'ai ajouté un exemple d'utilisation. J'espère que cela rend les choses un peu plus claires.
Arman Nisch
1
Merci un million, entrelacé est exactement ce dont j'avais besoin. À votre santé.
Nicholas Hamilton
1
La documentation pour cela n'est pas utile. J'ai aussi essayé avec quelques lignes de HTML et j'avais une page pleine de messages d'erreur. Quelqu'un a-t-il des exemples ou des ressources avec de la documentation?
Tarun Kolla
8
npm i html-react-parser;

import Parser from 'html-react-parser';

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

j'ai trouvé ce violon js. cela fonctionne comme ça

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>

lien jsfiddle

Hassan Gilak
la source
Malheureusement, le document ne fonctionne pas sur le rendu du serveur.
Laurent Van Winckel
Cela pourrait import JSDOM from 'jsdom'; global.window = new JSDOM('', { url: 'http://localhost' }); global.document = global.window.document;arriver si vous faites de la bonne chance
Coty Embry
2

Vous pouvez également utiliser Parser () à partir de html-react-parser. J'ai utilisé la même chose. Lien partagé.

Abhra Dey
la source
2

je commence à utiliser le paquet npm appelé react-html-parser

Dayan
la source
1

Pour ceux qui expérimentent encore, npm installe react-html-parser

Quand je l'ai installé, il y avait 123628 téléchargements hebdomadaires.

import ReactHtmlParser from 'react-html-parser'

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

Vous pouvez utiliser ce qui suit si vous souhaitez rendre le code HTML brut dans React

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

Exemple - Rendu

Le test est une bonne journée

Panayiotis Georgiou
la source