根据this course的建议,私有选择器将被重复作为要在完整状态下使用的公共选择器。
但这将导致:
是否有更好的方式组织选择器?
根减少器和公共选择器:
// reducers/index.js
import todos, * as fromTodos from './todos';
// Reducer
export default combineReducers({
todos
});
// Private selector
getVisibleTodos(state, filter) {
return fromTodos.getVisibleTodos(state.todos, filter);
}
Slice Reducer和专用选择器:
// reducers/todos.js
// Reducer
export default (state, action) => {
switch(action.type){
case 'ADD_TODO':
// ...
break;
// Handle other actions ...
}
}
// Private selector
getVisibleTodos(state, filter) {
switch(filter) {
case 'all':
return todos;
case 'completed':
return state.filter(t => t.completed);
// Other cases ...
}
}
使用选择器:
const mapStateToProps = (state, {params}) => ({
todos: getVisibleTodos(state, params.filter || 'all')
});
答案 0 :(得分:1)
将私有选择器复制为公共选择器有一些优点和缺点。
我认为,重复操作可以将关注点分离和封装逻辑,这对您有好处,即,每当您需要更改从redux状态获取某些数据的逻辑时,都无需修改组件。 此外,您的组件不应该具有将状态的相关部分切片的逻辑。
但是,确实发生了一些不必要的重复。 我可以考虑使用glob库的解决方案,但可能需要您在单独的文件中列出所有选择器。 使用glob,您可以遍历选择器文件夹中的所有js文件(您可以增加复杂性以忽略某些文件(查看它们的实例原型,而忽略某些文件),并将它们合并到根reducer文件中)。 我已经看到了快递应用中使用的这项技术,即通过为每个路由创建一个js文件来将所有路由汇总到一个地方。
希望它清楚并为您提供帮助。
编辑->我强烈建议您查看this article,以深入了解为什么将私有选择器复制为root reducer中的公共选择器是有好处的(尽管知道开始认为您也可以将公共选择器放在单独的文件中...)