Jawaban pertama tidak mencerminkan paradigma Container vs Presenter saat ini .
Jika Anda perlu melakukan sesuatu, seperti memvalidasi kata sandi, kemungkinan Anda memiliki fungsi yang melakukannya. Anda akan meneruskan fungsi itu ke tampilan yang dapat digunakan kembali sebagai penyangga.
Wadah
Jadi, cara yang benar untuk melakukannya adalah dengan menulis ValidatorContainer, yang akan memiliki fungsi itu sebagai properti, dan membungkus formulir di dalamnya, meneruskan alat peraga yang tepat kepada anak. Ketika datang ke tampilan Anda, wadah validator Anda membungkus tampilan Anda dan tampilan mengkonsumsi logika kontainer.
Validasi dapat dilakukan semua di properti penampung, tetapi jika Anda menggunakan validator pihak ketiga, atau layanan validasi sederhana apa pun, Anda dapat menggunakan layanan ini sebagai properti komponen kontainer dan menggunakannya dalam metode penampung. Saya telah melakukan ini untuk komponen yang tenang dan bekerja dengan sangat baik.
Penyedia
Jika ada sedikit konfigurasi yang diperlukan, Anda dapat menggunakan model Penyedia / Konsumen. Penyedia adalah komponen tingkat tinggi yang membungkus di suatu tempat dekat dan di bawah objek aplikasi teratas (yang Anda pasang) dan memasok bagian dari dirinya sendiri, atau properti yang dikonfigurasi di lapisan atas, ke konteks API. Saya kemudian mengatur elemen wadah saya untuk mengkonsumsi konteksnya.
Hubungan konteks orang tua / anak tidak harus dekat satu sama lain, hanya saja anak harus diturunkan dengan cara tertentu. Redux menyimpan dan Bereaksi fungsi Router dengan cara ini. Saya telah menggunakannya untuk memberikan konteks root restful untuk wadah istirahat saya (jika saya tidak menyediakan sendiri).
(catatan: API konteks ditandai eksperimental dalam dokumen, tapi saya rasa itu tidak lagi, mengingat apa yang menggunakannya).
//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
Cara lain yang belum saya coba, tetapi terlihat digunakan, adalah menggunakan middleware bersamaan dengan Redux. Anda menentukan objek layanan Anda di luar aplikasi, atau setidaknya, lebih tinggi dari toko redux. Selama pembuatan toko, Anda menyuntikkan layanan ke middleware dan middleware menangani tindakan apa pun yang memengaruhi layanan.
Dengan cara ini, saya bisa menyuntikkan objek restful.js saya ke middleware dan mengganti metode wadah saya dengan tindakan independen. Saya masih membutuhkan komponen kontainer untuk memberikan tindakan ke lapisan tampilan formulir, tetapi terhubung () dan mapDispatchToProps telah saya bahas di sana.
Misalnya, v4 react-router-redux menggunakan metode ini untuk memengaruhi keadaan sejarah, misalnya.
//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)
}
}