Voici mon senario:
1. Demande d'application CMS (Content management system) pour le contenu des pages.
2. Retour du CMS "<div>Hi,<SpecialButton color="red">My Button</SpecialButton></div>"
3. L'application consomme le contenu, rend le composant correspondant avec les données fournies dans l'attribut.
Je ne peux pas comprendre comment faire étape 3 de la manière React, tout conseil est apprécié.
Merci @Glenn Reyes, voici un Sandbox pour montrer le problème.
import React from 'react';
import { render } from 'react-dom';
const SpecialButton = ({ children, color }) => (
<button style={{color}}>{children}</button>
);
const htmlFromCMS = `
<div>Hi,
<SpecialButton color="red">My Button</SpecialButton>
</div>`;
const App = () => (
<div dangerouslySetInnerHTML={{__html: htmlFromCMS}}>
</div>
);
// expect to be same as
// const App = () => (
// <div>Hi,
// <SpecialButton color="red">My Button</SpecialButton>
// </div>
// );
render(<App />, document.getElementById('root'));
Voici une démo live faite par Vuejs. Chaîne "<div v-demo-widget></div>"
pourrait être traité comme une directive Vuejs et rendu. Code source .
Vous voudrez probablement approfondir dangerouslySetInnerHTML
. Voici un exemple de rendu HTML à partir d'une chaîne dans un composant React:
import React from 'react';
import { render } from 'react-dom';
const htmlString = '<h1>Hello World! ????</h1>';
const App = () => (
<div dangerouslySetInnerHTML={{ __html: htmlString }} />
);
render(<App />, document.getElementById('root'));
Exemple complet ici: https://codesandbox.io/s/xv40xXQzE
En savoir plus sur dangerouslySetInnerHTML
dans les documents React ici: https://facebook.github.io/react/docs/dom-elements.html#dangerouslysetinnerhtml
Vous pouvez utiliser le react-html-parser
au cas où vous ne voudriez pas utiliser l'attribut dangerouslySetInnerHTML
import React from 'react';
import { render } from 'react-dom';
import ReactHtmlParser from 'react-html-parser';
const SpecialButton = ({ children, color }) => (
<button style={{color}}>{children}</button>
);
const htmlFromCMS = `
<div>Hi,
<SpecialButton color="red">My Button</SpecialButton>
</div>`;
const App = () => (
<div>
{ReactHtmlParser(htmlFromCMS)}
</div>
);
render(<App />, document.getElementById('root'));
Joyeux codage !!!
Pour toute amélioration future de GProst Answer, vous pouvez utiliser ReactDOMserver, c'est ainsi que nous pouvons implémenter la même chose.
import React from "react";
import { render } from "react-dom";
import { renderToString } from "react-dom/server";
const SpecialButton = ({ children, color }) => (
<button style={{ color }}>{children}</button>
);
const renderButton = renderToString(<SpecialButton>MyButton</SpecialButton>);
const htmlFromCMS = `
<div>Hi,
${renderButton}
</div>`;
const App = () => <div dangerouslySetInnerHTML={{ __html: htmlFromCMS }} />;
render(<App />, document.getElementById("root"));
Vous pouvez essayer d'utiliser ReactDOMserver
pour rendre <MyReactComponent />
dans html
sur votre serveur, puis passez-le au client, où vous pouvez insérer tous les html
reçus via dangerouslySetInnerHTML
.