【发布时间】:2018-09-15 04:01:31
【问题描述】:
假设我有两个 redux 连接的组件。第一个是一个简单的 todo 加载/显示容器,将以下函数传递给connect(); mapStateToProps 从 redux state 中读取 todos,mapDispatchToProps 用于请求 state 提供服务器最新的 todos 列表:
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);
第二个 redux 组件旨在应用于页面上的任何组件,以便组件可以指示是否显示全局“加载”图标。由于这可以在任何地方使用,我创建了一个辅助函数,它将MapDispatchToProps 包装在一个闭包中并为每个组件生成一个 ID,用于确保所有请求加载器的组件都表明它们不再需要它,并且可以隐藏全局加载器。
功能基本如下,mapStateToProps 向组件公开加载器可见性,mapDispatchToProps 允许它们请求加载器显示或隐藏。
加载.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);
并且它应该给它一个唯一的ID,允许它请求加载器显示/隐藏,并且只要有一个组件请求它显示,加载器图标就会显示。到目前为止,这一切似乎都运行良好。
我的问题是,如果我想将此应用于 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);
假设没有重复的键,redux 会自动将对象合并在一起以使它们兼容吗?还是只需要最近的一组mapStateToProps/mapDispatchTo,除非我进行某种手动合并?或者有没有更好的方法来获得这种我没有看到的可重用性?我真的宁愿避免为我们需要的每个组件创建一组自定义容器。
【问题讨论】:
标签: javascript reactjs ecmascript-6 redux react-redux