8

Das ist mein Senario:
1. Antrag Antrag CMS (Content-Management-System) für den Inhalt der Seite.
2. CMS Rückkehr "<div>Hi,<SpecialButton color="red">My Button</SpecialButton></div>"
3. Anwendung verbrauchen die Inhalte, machen mit Daten entsprechende Komponente in Attribut versehen.Wie HTML zu React Komponente zu analysieren?

Ich kann nicht herausfinden, wie man Schritt 3 in Reactive Weise tut, wird jeder möglicher Rat geschätzt.

Dank @Glenn Reyes, hier ist ein Sandbox das Problem zu zeigen.

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')); 

Here is a live demo von Vuejs gemacht. Die Zeichenfolge "<div v-demo-widget></div>" könnte als Vuejs-Anweisung behandelt und gerendert werden. Source Code.

+0

Ich habe keine, eine definitive Antwort für Sie, Andy, aber könnte Sie in eine Richtung zeigen, abhängig davon, wie Sie die CMS-Daten erhalten. Haben Sie versucht, eine Komponente höherer Ordnung zu verwenden, um die Komponente zurückzugeben, die von der Anfrage zurückkommt? Ich denke, dass eine Komponente, die dann die angeforderte Komponente darstellt, der richtige Weg ist. –

+0

@BrettEast, eine höhere Ordnung Komponente die Anforderung tun könnte, aber mein Problem ist, nachdem die Zeichenfolge wie '

Hallo

bekommen ' von CMS, wie reagieren zu lassen, den Teil wissen ' 'ist eine Komponente, die den Code der Komponente austesten muss. –

+0

Ja, das ist knifflig, jede Chance, dass Ihre eingehenden Daten auf Benennungsmuster reagieren, mit einem Großbuchstaben für reagierende Komponenten und Kleinbuchstaben für HTML-Elemente? Vielleicht könnte eine Regex den Trick machen? –

Antwort

1

können Sie versuchen, den Einsatz ReactDOMserver<MyReactComponent /> in html auf Ihrem Server zu machen und es dann an den Client übergeben, wo Sie alle html über dangerouslySetInnerHTML empfangen einfügen können.

+0

Laut [ReactDOMServer] (https://facebook.github.io/react /docs/react-dom-server.html), "RenderToString" akzeptiert eine 'Komponente' als Parameter und keine Zeichenkette wie '", so dass sie nicht richtig dargestellt werden konnte. –

+0

Sicher, zuerst müssen Sie entsprechende Klasse durch den Komponentennamen finden. Und dann render es. Ich nehme an, es wird leicht für Sie sein, es auf der Serverseite (in CMS) zu tun. Andernfalls müssen Sie die gesamte Zeichenfolge syntaktisch analysieren, reine HTML- und React-Komponenten voneinander trennen und sie dann in einer anderen Komponente zusammen rendern. Wie auch immer, das ist keine triviale Aufgabe, ich schlage vor, Sie finden eine Workaround. – GProst

+0

Ich sehe, also ist Ihr Vorschlag die in CMS eingefügte Komponentenlogik, und CMS gibt die wiedergegebene Komponentenzeichenfolge zurück? –

2

Sie wollen wahrscheinlich tiefer in dangerouslySetInnerHTML suchen. Hier ist ein Beispiel, wie HTML zu rendern, von einem String in einem React Komponente:

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')); 

Voll Beispiel hier: https://codesandbox.io/s/xv40xXQzE

Lesen Sie mehr über dangerouslySetInnerHTML in den React docs hier: https://facebook.github.io/react/docs/dom-elements.html#dangerouslysetinnerhtml

+0

Was passiert, wenn htmlString eine reactComponent Zeichenfolge enthält wie '"

Hallo

"? Die 'MyReactComponent' wird HTML-String nicht eine echte Komponente –

+0

Sorry Leute, geben Sie mir eine Sekunde Ich mache ein vollständiges Beispiel, um Missverständnisse zu reduzieren. –

+1

Interessant, ich bekomme, was Sie suchen. Ich habe eine Code-Sandbox hier erstellt: https://codesandbox.io/s/WnKvoY6BE – glennreyes

Verwandte Themen