Скажем, у меня есть два компонента, подключенных к редуксу. Первый - это простой контейнер загрузки / отображения задач со следующими функциями, переданными connect()
; mapStateToProps
считывает задачи из состояния избыточности, а mapDispatchToProps
используется для запроса состояния о предоставлении последнего списка задач с сервера:
TodoWidgetContainer.js
import TodoWidgetDisplayComponent from '...'
function mapStateToProps(state) {
return {
todos: todoSelectors.getTodos(state)
};
}
function mapDispatchToProps(dispatch) {
return {
refreshTodos: () => dispatch(todoActions.refreshTodos())
};
}
connect(mapStateToProps, mapDispatchTo)(TodoWidgetDisplayComponent);
Второй избыточный компонент предназначен для применения к любому компоненту на странице, чтобы компонент мог указать, отображается ли глобальный значок «загрузки». Поскольку это можно использовать где угодно, я создал вспомогательную функцию, которая упаковывает MapDispatchToProps
в замыкание и генерирует ID для каждого компонента, который используется для того, чтобы все компоненты, которые запрашивали загрузчик, указывали, что им это больше не нужно, и глобальный загрузчик может быть скрыт.
Функции в основном следующие: mapStateToProps
предоставляет компонентам видимость загрузчика, а mapDispatchToProps
позволяет им запрашивать загрузчик, чтобы показать или скрыть.
Loadify.js
function mapStateToProps(state) {
return {
openLoader: loaderSelectors.getLoaderState(state)
};
}
function mapDispatchToProps() {
const uniqId = v4();
return function(dispatch) {
return {
showLoader: () => {
dispatch(loaderActions.showLoader(uniqId));
},
hideLoader: () => {
dispatch(loaderActions.hideLoader(uniqId));
}
};
};
}
export default function Loadify(component) {
return connect(mapStateToProps, mapDispatchToProps())(component);
}
Итак, теперь, если у меня есть компонент, которому я хочу предоставить доступ к загрузчику, я могу просто сделать что-то вроде этого:
import Loadify from '...'
class DisplayComponent = new React.Component { ... }
export default Loadify(DisplayComponent);
И он должен дать ему уникальный идентификатор, разрешить ему запрашивать загрузчик, чтобы показать / скрыть, и пока есть один компонент, который запрашивает его показать, значок загрузчика будет отображаться. Пока что все это работает нормально.
У меня вопрос: если бы я хотел применить это к компоненту todos, чтобы этот компонент мог запрашивать / получать свои todos, а также иметь возможность запрашивать загрузчик для отображения во время его обработки, я мог бы просто сделать что-то вроде :
TodoWidgetContainer.js
import Loadify from '...'
import TodoWidgetDisplayComponent from '...'
function mapStateToProps(state) {
return {
todos: todoSelectors.getTodos(state)
};
}
function mapDispatchToProps(dispatch) {
return {
refreshTodos: () => dispatch(todoActions.refreshTodos())
};
}
const TodoContainer = connect(mapStateToProps, mapDispatchTo)(TodoWidgetDisplayComponent);
export default Loadify(TodoContainer);
И будет ли приставка автоматически объединять объекты, чтобы сделать их совместимыми, при условии, что нет повторяющихся ключей? Или потребуется только самый последний набор mapStateToProps
/ mapDispatchTo
, если я не сделаю какое-то ручное слияние? Или есть лучший способ получить такой вид повторного использования, которого я не вижу? Я бы действительно предпочел не создавать пользовательский набор контейнеров для каждого компонента, который нам нужен.