Ich benutze reactjs.net, um Komponenten Serverseite zu rendern. Mein Problem ist, ich wurde gebeten, die HTML-Zeichenfolgen für die Komponente und das entsprechende Javascript über einen Ajax-Aufruf zu erhalten und die Komponente zu rendern.Ereignisse nicht bindend für serve Seite gerendert Komponente
Dies ist meine Methode, die den HTML-String gibt.
public JsonResult GetComponent(string strComponentName)
{
string strHtml = "";
IHtmlContent htmlc= HtmlHelperExtensions.React(null, String.Format("Components.{0}", strComponentName), new { });
strHtml = GetString(htmlc);
IHtmlContent jscript = HtmlHelperExtensions.ReactInitJavaScript(null);
string strJavascript = GetString(jscript);
jsonresponse jr = new jsonresponse();
jr.html = strHtml;
jr.javascript = strJavascript;
return Json(jr);
}
Nun wird diese Funktion beim Klickereignis einiger Schaltflächen aufgerufen. Nachdem die empfangenen Zeichenfolgen gerendert wurden.
fetchComp() {
let FETCH_URL: string = "/Home/GetComponent?strComponentName=" + this.props.componentName;
fetch(FETCH_URL, {
method: 'GET'
})
.then(response => response.json())
.then(json => {
console.log("json from wrapper", json);
const html = json.html;
const javascript = json.javascript;
this.setState({ html: html, javascript: javascript,rendered: true });
console.log("state val", this.state);
});
}
die Render-Methode ist als
render() {
if (!this.state.rendered) {
this.fetchComp();
}
return (<div>
<div dangerouslySetInnerHTML={{ __html: this.state.html+" <script src=\"~/dist/client.bundle.js\"></script>" +this.state.javascript }} />
</div>);
}
die Ereignisse für die gerenderte Komponente funktionieren nicht folgt. obwohl die javascript-erforderlichen Ereignisse zusammen mit der Komponente gerendert wurden.
Edit: Ich habe auch versucht, das Skript zum Hauptteil hinzufügen, indem Sie ein Skriptelement erstellen und an document.body anhängen. funktionierte nicht
Ich setze den Status nirgendwo direkt –
Ich vermute, dass Sie den 'gerenderten' Zustand zunächst als falsch haben werden. Während des ersten Ladevorgangs wird die Methode 'fetchComp' aufgerufen, die den Fetch-Aufruf ausführt. Sie legen dort den Status mit den Daten fest und machen den 'gerenderten' Zustand wahr. Dieser setState wird direkt von render gemacht. Dies verursacht eine Endlosschleife. Überprüfen Sie die Konsole :-) –
ja. aber das ist nicht das Problem. Es wird korrekt gerendert. Nach dem Rendern werden die Clickevents in den gerenderten Komponenten jedoch nicht ausgelöst. –