Как организовать бизнес-логику в React+Redux+thunk
Я работал на переднем конце с реакции + редукса.
Поскольку все мы знаем, что redux создает компонент контейнера, который отвечает за размещение бизнес-логики. Практически, мы будем предоставлять mapStateToProps и mapDispatchToProps для функции соединения, особенно с mapDispatchToProps, мы можем отправлять события, чтобы заставить редукторы работать значительно.
Есть функциональность мастера, которая имеет много видов типов, и у каждого есть более 10 шагов, поэтому я хочу организовать команду "следующий шаг","предыдущий шаг" и вызвать функцию дочернего элемента, такую как проверка, при нажатии этих кнопок. но я думаю "реф" не рекомендуется. Но с оригинальным дизайном редукса, я должен отправить событие в следующем коде
const mapDispatchToProps = (dispatch, ownProps) => ({
onNext: () => {
dispatch(nextStep());
}
}
где и как вызывать проверку дочернего контроля - проблема, связанная с дизайном с избыточностью, может быть, нам следует обработать его в создателе действий, но я думаю, что это действие с асинхронным запросом или просто с простым объектом, оно не должно обрабатывать логику, так как мы вводим объект контейнера для обработки "как это работает".
Поэтому я выставляю контроллер в дочернем контейнере, как показано ниже:
export {
childContainer,
childNavController
};
Дочерний контейнер, используемый для визуализации дочернего элемента и логики, childNavController для предоставления функции проверки. но таким образом у нас нет доступа к объекту отправки, поэтому я делаю это ниже:
const mapDispatchToProps = (dispatch, ownProps) => ({
onNext: () => {
dispatch(nextStep(wizardCreator));
}
}
const wizardCreator= (step) => {
// according to the step reuturn different controller instance
return childNavController;
};
В файле создателя действий:
const nextStep=(childCreator)=>{
return function (dispatch, getState) {
return Promise.resolve().then(()=>{
const currentState = getState();
const controller=childCreator(currentState.step);
// this make the business also can work with dispatch object
controller.validation(dispatch,getState);
});
}
}
Этот способ имеет смысл, но я также подумал, что это странно, без ОО, без элегантного дизайна, просто заставить его работать.
так, если есть какие-либо предложения или дизайн для этого сценария?
1 ответ
Не обязательно использовать mapDispatchToProps
для того, чтобы отправить действие внутри компонента. Просто для звонка connect(null)(Component)
компонент получает диспетчерскую функцию в качестве опоры. Затем вы можете определить метод и выполнить логику для проверки перед отправкой нужного вам действия.
Например,
import React from 'react';
import { connect } from 'react-redux';
const Container = (props) => {
const onClick = () => {
// some logic
if (valid) props.dispatch(someAction())
}
return <button onClick={onClick}>Next</button>
}
export default connect()(Container);