Redux:私有/公共选择器的更好方法

时间:2018-11-13 08:47:04

标签: javascript redux react-redux

根据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')
});

1 个答案:

答案 0 :(得分:1)

将私有选择器复制为公共选择器有一些优点和缺点。

我认为,重复操作可以将关注点分离和封装逻辑,这对您有好处,即,每当您需要更改从redux状态获取某些数据的逻辑时,都无需修改组件。 此外,您的组件不应该具有将状态的相关部分切片的逻辑。

但是,确实发生了一些不必要的重复。 我可以考虑使用glob库的解决方案,但可能需要您在单独的文件中列出所有选择器。 使用glob,您可以遍历选择器文件夹中的所有js文件(您可以增加复杂性以忽略某些文件(查看它们的实例原型,而忽略某些文件),并将它们合并到根reducer文件中)。 我已经看到了快递应用中使用的这项技术,即通过为每个路由创建一个js文件来将所有路由汇总到一个地方。

希望它清楚并为您提供帮助。

编辑->我强烈建议您查看this article,以深入了解为什么将私有选择器复制为root reducer中的公共选择器是有好处的(尽管知道开始认为您也可以将公共选择器放在单独的文件中...)