javascript - 如何分离相互依赖的 redux reducer?

标签 javascript reactjs redux reducers

我有一个小应用程序,用户会看到一个小列表,她可以动态过滤。

所以我认为我的状态应该是这样的:

{ data: [], filters: {}, filteredData: [] }

..这可能已经是个坏主意了。

到目前为止,我也只有一个 reducer,它响应这些 Action :

  • UPDATE_FILTERS
  • 初始DATA_RECEIVED(仅在页面加载时一次)。

我的 reducer 看起来像这样:

import {UPDATE_FILTERS, DATA_RECEIVED} from '../actions/actions'

function getFilteredDataRows(filters, data){

    const distanceMin = parseInt(filters.distanceMin) || 0;
    const distanceMax = parseInt(filters.distanceMax) || 9999999999;
    const location = filters.location || '';
    return (
        data
        .filter((swim) => swim.location.toLowerCase().includes(location.toLowerCase()))
        .filter((swim) => swim.distance > distanceMin)
        .filter((swim) => swim.distance < distanceMax)
    );
}

const filterReducer = (state = [], action) => {
    switch(action.type){
        case UPDATE_FILTERS:
            const newFilters = Object.assign({}, state.filters, action.filters);
            return { filters : newFilters, data: state.data, filteredData: getFilteredDataRows(newFilters, state.data)};

        case DATA_RECEIVED:
            return {filters : state.filters, data: action.data, filteredData: getFilteredDataRows(state.filters, action.data)};
        default:
            return state
    }
}


export default filterReducer;

所有这些都有效。但对我来说,它也很臭。 我遵循了 redux 教程(Dan. with Todo 的教程)

我希望能够将我的 reducer 分成两部分:

  • FilterReducer(过滤器更新)
  • DataReducer(过滤后的数据更新)

但是第二个依赖于第一个,我不知道如何以干净的方式做到这一点。

你有什么想法吗?

提前致谢

最佳答案

可以在多个reducer 中监听相同的 Action 。

filterReducerfilteredDataReducer 中监听 UPDATE_FILTERS 操作。

在filterReducer中,修改store的filters部分。

在filteredData reducer中,修改store的数据部分。

filterReducer.js:

const filterReducer = (state = [], action) => {
   switch(action.type){
        case UPDATE_FILTERS:
   return Object.assign({}, state, filters: action.filters);
        default:
            return state
    }
}

filteredData.js:

const filteredDataReducer = (state = [], action) => {
switch(action.type){
        case UPDATE_FILTERS:
            return Object.assign({}, state, filteredData: getFilteredData(action.filters, state.data));
        default:
            return state
    }
}

关于javascript - 如何分离相互依赖的 redux reducer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47012545/

相关文章:

javascript - 使用带有表单的 jquery 进行自定义验证

javascript - 在react.js中像纯文本一样显示javascript/html代码

reactjs - 如何在 redux 工具包中模拟存储

javascript - 使用 Mocha 设置 JSDOM

php - KCFinder - browse.php 下载而不是显示页面

javascript - 在 jquery 对话框而不是 html 上显示加载器 div

html - 在 react js中滑动动画

javascript - 带标签的 React Native 散点图

javascript - 使用扩展运算符更新非常深的对象

javascript - 从内部/私有(private)函数调用公共(public)函数?