Die erste Antwort spiegelt nicht das aktuelle Paradigma von Container vs Presenter wider .
Wenn Sie etwas tun müssen, z. B. ein Passwort validieren, haben Sie wahrscheinlich eine Funktion, die dies tut. Sie würden diese Funktion an Ihre wiederverwendbare Ansicht als Requisite übergeben.
Behälter
Der richtige Weg, dies zu tun, besteht darin, einen ValidatorContainer zu schreiben, der diese Funktion als Eigenschaft hat, und das Formular darin zu verpacken und die richtigen Requisiten an das Kind zu übergeben. Wenn es um Ihre Ansicht geht, schließt Ihr Validator-Container Ihre Ansicht ein und die Ansicht verbraucht die Container-Logik.
Die Validierung kann in den Eigenschaften des Containers erfolgen. Wenn Sie jedoch einen Validator eines Drittanbieters oder einen einfachen Validierungsdienst verwenden, können Sie den Dienst als Eigenschaft der Containerkomponente verwenden und in den Methoden des Containers verwenden. Ich habe dies für erholsame Komponenten getan und es funktioniert sehr gut.
Anbieter
Wenn etwas mehr Konfiguration erforderlich ist, können Sie ein Provider / Consumer-Modell verwenden. Ein Anbieter ist eine übergeordnete Komponente, die sich in der Nähe und unterhalb des obersten Anwendungsobjekts (das von Ihnen bereitgestellten) befindet und der Kontext-API einen Teil von sich selbst oder eine in der obersten Ebene konfigurierte Eigenschaft bereitstellt. Ich setze dann meine Containerelemente so, dass sie den Kontext verbrauchen.
Die Eltern-Kind-Kontextbeziehungen müssen nicht nahe beieinander liegen, nur das Kind muss auf irgendeine Weise abstammen. Redux-Speicher und der React Router funktionieren auf diese Weise. Ich habe es verwendet, um einen Root-Restful-Kontext für meine Rest-Container bereitzustellen (wenn ich keinen eigenen bereitstelle).
(Hinweis: Die Kontext-API ist in den Dokumenten als experimentell markiert, aber ich glaube nicht, dass dies mehr der Fall ist, wenn man bedenkt, was sie verwendet.)
//An example of a Provider component, takes a preconfigured restful.js
//object and makes it available anywhere in the application
export default class RestfulProvider extends React.Component {
constructor(props){
super(props);
if(!("restful" in props)){
throw Error("Restful service must be provided");
}
}
getChildContext(){
return {
api: this.props.restful
};
}
render() {
return this.props.children;
}
}
RestfulProvider.childContextTypes = {
api: React.PropTypes.object
};
Middleware
Ein weiterer Weg, den ich nicht ausprobiert, aber als gebraucht angesehen habe, ist die Verwendung von Middleware in Verbindung mit Redux. Sie definieren Ihr Serviceobjekt außerhalb der Anwendung oder zumindest höher als der Redux-Speicher. Während der Filialerstellung fügen Sie den Dienst in die Middleware ein, und die Middleware verarbeitet alle Aktionen, die sich auf den Dienst auswirken.
Auf diese Weise konnte ich mein restful.js-Objekt in die Middleware einfügen und meine Containermethoden durch unabhängige Aktionen ersetzen. Ich würde immer noch eine Containerkomponente benötigen, um die Aktionen für die Formularansichtsebene bereitzustellen, aber connect () und mapDispatchToProps haben mich dort behandelt.
Der neue v4-React-Router-Redux verwendet diese Methode beispielsweise, um den Status des Verlaufs zu beeinflussen.
//Example middleware from react-router-redux
//History is our service here and actions change it.
import { CALL_HISTORY_METHOD } from './actions'
/**
* This middleware captures CALL_HISTORY_METHOD actions to redirect to the
* provided history object. This will prevent these actions from reaching your
* reducer or any middleware that comes after this one.
*/
export default function routerMiddleware(history) {
return () => next => action => {
if (action.type !== CALL_HISTORY_METHOD) {
return next(action)
}
const { payload: { method, args } } = action
history[method](...args)
}
}