Das Flux-Modell schreibt vor, dass Statusänderungen in den Ansichten ausgelöst werden, Aktionen ausgelöst werden, die über den Dispatcher ausgeführt werden, und in einem Geschäft zurück in Listening-Ansichten propagiert werden.In Flux/React.js, wo jQuery-Plugins initialisiert werden?
Das ist alles schön und gut. Aber was, wenn ich eine bestimmte DOM-Operation nach einer bestimmten Änderung im Zustand durchführen muss? In der realen Welt Anwendungen, müssen wir manchmal verwenden, dass Sie wissen, Relikt genannt jQuery Plugins (nicht vergessen, die?)
Zum Beispiel muss ich ein jQuery-Video-Player initialisieren, à la $('#videoContainer').initPlayer(streamURL)
, nach eine Ajax-Anforderung zum AbrufenstreamURL
. widmen Sie einen Moment Zeit, um herauszufinden, wie Sie tun würde, dass mit Flux/Reaktion, vor dem Lesen auf).
Auf der Ansicht Teil, könnte ich componentWillReceiveProps
verwenden:
var jsVideoPlayer = React.createClass({
componentWillReceiveProps: function(nextProps) {
$(this.refs.videoContainer.getDOMNode()).initPlayer(nextProps.streamURL);
},
render: function() {
return (
<div ref="videoContainer">
</div>
);
}
});
Aber hier, würden die Spieler jedes Mal aktualisiert, um den Zustand initialisiert erhalten. Das würde unseren Videoplayer sicherlich kaputt machen. Lassen Sie uns überprüfen, ob sich die URL geändert hat, bevor wir etwas tun:
componentWillReceiveProps: function(nextProps) {
if (nextProps.streamURL && nextProps.streamURL !== this.streamURL) {
this.streamURL = nextProps.streamURL;
$(this.refs.videoContainer.getDOMNode()).initPlayer(nextProps.streamURL);
}
},
Einfach, oder? Aber was ist mit dem größeren Bild? Was ist, wenn wir das skalieren - und weiter -, wenn wir weitere Funktionen und UI-Elemente hinzufügen, die zu mehr benutzerdefinierten Validierungscode in den Ansichten führen könnten, was aus dem Geschäft kommt. Selbst in einer perfekten App, in der jeder Laden seine eigene Domain hat und alles blitzblank in Designmustern auf einer Ebene liegt, die einer engagierten religiösen Anhängerschaft würdig ist, müssten wir immer mehr Logik in den Ansichten verwenden, wie die App skalieren würde .
In unserem Team habe ich argumentiert, diese Logik wirklich in eine ControllerView gehen sollte, die den Flux-Modell passt - aber jeder argumentiert sonst etwas, ist der Rahmen, der dafür sorgen sollte. Wir sind neu in Flux/React und konnten uns keine bessere Idee ausdenken, wie wir das Framework für uns machen können.
warum nicht nur in die Komponente componentDidMount oder componentDidUpdate? – zackify
@zackify, weil es von einer Ajax-Anfrage abhängig ist, die nur auftritt, wenn ein Benutzer auf eine Schaltfläche klickt – pilau
Warum nicht einfach eine Aktion wie VIDEO_URL_RETRIEVED verwenden, um einen Status in Ihrem Geschäft zu aktualisieren? Ihre controller-view-Komponente erhält den aktualisierten Status und in Ihrem jsVideoPlayer, wenn die Props streamUrl nicht null ist, können Sie Ihr jQuery-Plugin initialisieren. Wenn Ihre Komponente eine reine Rendermethode hat, wird sie nur einmal aktualisiert: wenn die Aktion VIDEO_URL_RETRIEVED ausgelöst wird. – Pcriulan