Voici ce que j'ai essayé et comment ça va mal.
Cela marche:
<div dangerouslySetInnerHTML={{ __html: "<h1>Hi there!</h1>" }} />
Cela ne:
<div dangerouslySetInnerHTML={{ __html: this.props.match.description }} />
La propriété description est simplement une chaîne normale de contenu HTML. Cependant, il est rendu sous forme de chaîne et non de HTML pour une raison quelconque.
Aucune suggestion?
javascript
html
reactjs
jsx
Sergio Tapia
la source
la source
dangerouslySetInnerHTML
place l'utilisationFragment
de react v16. Vérifiez la prochaine réponse de @ brad-adamsEst
this.props.match.description
-ce qu'une chaîne ou un objet? S'il s'agit d'une chaîne, elle doit être convertie en HTML très bien. Exemple:Résultat: http://codepen.io/ilanus/pen/QKgoLA?editors=1011
Cependant, si
description: <h1 style="color:red;">something</h1>
sans les citations,''
vous obtiendrez:S'il s'agit d'une chaîne et que vous ne voyez aucun balisage HTML, le seul problème que je vois est un balisage incorrect.
METTRE À JOUR
Si vous traitez avec HTMLEntitles. Vous devez les décoder avant de les envoyer,
dangerouslySetInnerHTML
c'est pourquoi ils l'ont appelé dangereusement :)Exemple de travail:
la source
this.props.match.description
est une chaîne, pas un objet. Que voulez-vous dire par un mauvais balisage? Voulez-vous dire des tags non fermés? React devrait simplement le rendre non?<p><strong>Our Opportunity:</strong></p>
J'utilise 'react-html-parser'
Source sur npmjs.com
Soulevez le commentaire de @ okram pour plus de visibilité:
la source
Converts HTML strings directly into React components avoiding the need to use dangerouslySetInnerHTML
de npmjs.comA utility for converting HTML strings into React components. Avoids the use of dangerouslySetInnerHTML and converts standard HTML elements, attributes and inline styles into their React equivalents.
Si vous avez le contrôle sur la provenance de la chaîne contenant le HTML (c'est-à-dire quelque part dans votre application), vous pouvez bénéficier de la nouvelle
<Fragment>
API, en faisant quelque chose comme:la source
Fragment
API, c'était toujours une douleur pour moi, cela nécessitait desspan
enveloppes supplémentaires qui gênaient parfois les dispositions flexibles. Quand je suis tombé sur cette question à la recherche d'une solution possible, j'ai pensé partager comment je contournais les choses.Some text <strong>wrapped with strong</strong>
-à- dire contient une balise htmlstrong
.Vous utilisez simplement la méthode dangerouslySetInnerHTML de React
<div dangerouslySetInnerHTML={{ __html: htmlString }} />
Ou vous pouvez en implémenter plus avec cette méthode simple: Rendre le HTML brut dans l'application React
la source
dangereusementSetInnerHTML
dangerouslySetInnerHTML est le remplacement de React pour l'utilisation de innerHTML dans le DOM du navigateur. En général, définir du code HTML à partir du code est risqué car il est facile d'exposer par inadvertance vos utilisateurs à une attaque de script intersite (XSS). Ainsi, vous pouvez définir HTML directement à partir de React, mais vous devez taper dangerouslySetInnerHTML et passer un objet avec une clé __html, pour vous rappeler que c'est dangereux. Par exemple:
la source
J'utilise innerHTML avec une référence pour couvrir:
la source
componentDidMount() { this.message.current.innerHTML = this.state.selectedMessage.body; }
body est le html échappé pour moi.Dans mon cas, j'ai utilisé react-render-html
Installez d'abord le package en
npm i --save react-render-html
puis,
la source
Je n'ai pas pu
npm build
travailler avecreact-html-parser
. Cependant, dans mon cas, j'ai pu utiliser avec succès https://reactjs.org/docs/fragments.html . J'avais besoin d'afficher quelques caractères unicode html, mais ils ne devraient pas être directement intégrés dans le JSX. Dans le JSX, il devait être sélectionné dans l'état du composant. L'extrait de code du composant est donné ci-dessous:la source
j'utilise https://www.npmjs.com/package/html-to-react
la source
Si vous avez le contrôle sur {this.props.match.description} et si vous utilisez JSX. Je recommanderais de ne pas utiliser "dangerouslySetInnerHTML".
la source