Перша відповідь не відображає поточну парадигму Container vs Presenter .
Якщо вам потрібно щось зробити, наприклад перевірити пароль, ви, ймовірно, матимете функцію, яка це робить. Ви передасте цю функцію в режим повторного використання як опора.
Контейнери
Отже, правильний спосіб зробити це - написати ValidatorContainer, який буде мати цю функцію як властивість, і загорнувши в нього форму, передаючи правильний реквізит дитині. Коли справа доходить до вашого перегляду, контейнер валідатора завершує ваш вигляд, і перегляд використовує логіку контейнерів.
Перевірка може бути виконана у властивостях контейнера, але якщо ви використовуєте сторонній валідатор або будь-яку просту службу перевірки, ви можете використовувати службу як властивість компонента контейнера та використовувати його у методах контейнера. Я зробив це для спокійних компонентів, і це працює дуже добре.
Постачальники
Якщо потрібно трохи більше конфігурації, ви можете використовувати модель постачальника / споживача. Постачальник - це компонент високого рівня, який загортається десь поблизу та під його об'єктом верхнього додатка (той, який ви встановлюєте), і постачає частину себе або властивість, налаштовану у верхньому шарі, API контексту. Потім я встановлюю свої елементи контейнера, щоб споживати контекст.
Контекстні відносини батько / дитина не повинні бути поруч один з одним, просто дитина має бути якимсь чином спускатися. Таким чином функціонують магазини Redux та маршрутизатор React. Я використовував його для забезпечення кореневого спокійного контексту для своїх контейнерів для відпочинку (якщо я не надаю свій власний).
(зауважте: контекстний API позначений експериментальним у документах, але я не думаю, що це більше, враховуючи, що він використовує).
//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
};
Посереднє програмне забезпечення
Наступним способом, який я не намагався, але я вважав, що використовується, - це використовувати проміжне програмне забезпечення спільно з Redux. Ви визначаєте свій об’єкт обслуговування за межами програми або, принаймні, вище, ніж сховище скорочення. Під час створення магазину ви вводите службу в проміжне програмне забезпечення, а проміжне програмне забезпечення обробляє будь-які дії, які впливають на службу.
Таким чином, я міг ввести свій об’єкт restful.js в середнє програмне забезпечення і замінити свої методи контейнерів незалежними діями. Мені все одно знадобиться компонент контейнера для надання дій шару перегляду форми, але підключити () і mapDispatchToProps мене там охоплює.
Новий v4-реактор-маршрутизатор v4 використовує цей метод, наприклад, для впливу на стан історії.
//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)
}
}