【问题标题】:Filtering and already filtered state过滤和已过滤状态
【发布时间】:2017-06-19 08:36:34
【问题描述】:

我发现很难应付今天的任务,因为我是 react-redux 的新手。让我解释。我有两个下拉列表和一个网格,就像下面的屏幕截图一样:

下拉列表的目的是过滤我的虚拟数据,第一个并排,第二个按状态。我创建了两个动作:

export function filterBySide(product_side) {
    const filtered_data_by_side = data.filter(record =>
      {
          return record.side.match(product_side)
      });

    return {
      type: FILTER_BY_SIDE,
      payload: {
        filtered_data_by_side
      }
  };
}

export function filterByStatus(product_status) {
    const filtered_data_by_status = data.filter(record =>
      {
          return record.status.match(product_status)
      });

    return {
      type: FILTER_BY_STATUS,
      payload: {
        filtered_data_by_status
      }
  };
}

如您所见,第一个负责侧面过滤,另一个负责状态过滤。然后我将这些传递给我的减速器,如下所示:

case FILTER_BY_SIDE:
      return state.set('filtered_data_by_side', List(action.payload.filtered_data_by_side));
    case FILTER_BY_STATUS:
      return state.set('filtered_data_by_status', List(action.payload.filtered_data_by_status));

然后我使用 MapStateToProps 使它们在帐户列表中可用:

function mapStateToProps(state) {
  return {
    filtered_data_by_side:state.customer.get('filtered_data_by_side'),
    filtered_data_by_status:state.customer.get('filtered_data_by_status')
  };
}

我还将我的操作提取到下拉列表中。 我的问题是,当我在我的网格中将filtered_data_by_side 作为数据传递时,只有第一个动作发生,而当我传递filtered_data_by_status 时,第二个动作当然是合理的。 所需的功能是当我选择第一个下拉列表来过滤我的数据,然后我选择第二个必须由第一个下拉列表过滤的数据,然后是第二个下拉列表,反之亦然。我该怎么做???

【问题讨论】:

    标签: reactjs filter action state


    【解决方案1】:

    一种方法是泛化过滤器函数并将过滤器持久化在reducer中。您可能拥有的是一个filterData 操作,它采用对象表示的不同类型的过滤器(即{ product_side : '...', product_status : '...' }))。当一个新的或现有的过滤器通过时,它可用于生成应用了所有其他过滤器的新数据。之后,可以在 reducer 中添加或更新它以维护过滤器的状态。

    考虑以下几点:

    // Action
    function setFilters(myFilters) {
      return {
        type: SET_FILTERS,
        payload: {
          myFilters
        }
      };
    }
    
    // Usage
    filterData({ ...oldFilters, status_filter: newStatusFilter });
    
    
    // Reducer
    function myReducer(state, action) {
    
       switch(action.type) {
        // ...
           FILTER:
             return Object.assign({}, state, {
               filters: action.payload
             });
        // ...
       }
    
    }
    

    渲染表格时,您可以查看属性以了解应用了哪些过滤器,然后在渲染之前相应地过滤数据。

    【讨论】:

    • 您还必须传递原始数据。目前传递的数据如何?我看到 data.filter 被使用,但没有定义数据
    • 感谢您的回复,马克斯!但是我的新减速器将如何组成??
    • 我的建议是在某处(即在 reducer 中)跟踪原始数据,并在必要时将其传递给过滤器操作。您的 reducer 将有一个您将更新的 filters 对象或数组,并且您在 reducer 上设置一个 filteredData 属性以指示数据已被过滤。渲染时,您将使用过滤后的数据(如果有)。否则,您将使用原始数据源
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2013-07-24
    • 2021-05-29
    相关资源
    最近更新 更多