Alors, est-ce la seule façon de rendre du HTML brut avec reactjs?
// 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>
);
}
});
Je sais qu'il existe des moyens sympas de baliser des trucs avec JSX, mais je suis principalement intéressé par la possibilité de rendre du html brut (avec toutes les classes, styles en ligne, etc.). Quelque chose de compliqué comme ça:
<!-- 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>
Je ne voudrais pas avoir à réécrire tout cela dans JSX.
Peut-être que je pense à tout cela mal. S'il vous plaît corrigez-moi.
javascript
reactjs
vinhboy
la source
la source
Réponses:
Vous pouvez
html-to-react
utiliser le module npm.Remarque: je suis l'auteur du module et je viens de le publier il y a quelques heures. N'hésitez pas à signaler tout bogue ou problème d'utilisation.
la source
Il existe désormais des méthodes plus sûres pour rendre le HTML. J'ai couvert cela dans une réponse précédente ici . Vous avez 4 options, les dernières utilisations
dangerouslySetInnerHTML
.Méthodes de rendu HTML
Le plus simple - Utilisez Unicode, enregistrez le fichier au format UTF-8 et définissez le
charset
sur UTF-8.<div>{'First · Second'}</div>
Plus sûr - Utilisez le numéro Unicode de l'entité dans une chaîne Javascript.
<div>{'First \u00b7 Second'}</div>
ou
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div>
Ou un tableau mixte avec des chaînes et des éléments JSX.
<div>{['First ', <span>·</span>, ' Second']}</div>
Dernier recours - Insérez du HTML brut en utilisant
dangerouslySetInnerHTML
.<div dangerouslySetInnerHTML={{__html: 'First · Second'}} />
la source
dangerouslySetInnerHTML
plus de __htmlJ'ai utilisé ceci dans des situations rapides et sales:
la source
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onload="alert('test');">
?J'ai essayé ce composant pur:
Caractéristiques
className
accessoire (plus facile à coiffer)\n
par<br />
(vous voulez souvent faire cela)<RawHTML>{myHTML}</RawHTML>
J'ai placé le composant dans un Gist sur Github: RawHTML: composant pur ReactJS pour rendre le HTML
la source
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).
Il est préférable / plus sûr de nettoyer votre HTML brut (en utilisant par exemple DOMPurify) avant de l'injecter dans le DOM via
dangerouslySetInnerHTML
.DOMPurify - un désinfectant XSS ultra-rapide et ultra-tolérant pour le DOM uniquement pour HTML, MathML et SVG. DOMPurify fonctionne avec une valeur par défaut sécurisée, mais offre beaucoup de configurations et de crochets.
Exemple :
la source
la source
J'ai utilisé cette bibliothèque appelée Parser . Cela a fonctionné pour ce dont j'avais besoin.
la source
dangerouslySetInnerHTML
ne doit pas être utilisé sauf en cas de nécessité absolue. Selon la documentation, "Ceci est principalement pour coopérer avec les bibliothèques de manipulation de chaînes DOM" . Lorsque vous l'utilisez, vous renoncez au bénéfice de la gestion DOM de React.Dans votre cas, il est assez simple de convertir une syntaxe JSX valide; changez simplement les
class
attributs enclassName
. Ou, comme mentionné dans les commentaires ci-dessus, vous pouvez utiliser la bibliothèque ReactBootstrap qui encapsule les éléments Bootstrap dans les composants React.la source
Voici une version un peu moins avisée de la fonction RawHTML publiée auparavant. Cela vous permet:
<br />
l »RawHTML></RawHTML>
)Voici le composant:
Usage:
Production:
Il se cassera sur:
la source
J'avais besoin d'utiliser un lien avec l'attribut onLoad dans ma tête où div n'est pas autorisé, donc cela m'a causé une douleur importante. Ma solution de contournement actuelle consiste à fermer la balise de script d'origine, à faire ce que je dois faire, puis à ouvrir la balise de script (à fermer par l'original). J'espère que cela pourrait aider quelqu'un qui n'a absolument pas d'autre choix:
la source