React Redux 过滤器操作(通用排序示例)

React Redux filter actions (generic sorting example)

我已经完成了一种创建通用排序减速器的方法。这个想法是调用一个动作并通过 action.meta.

中的一个字段过滤它

方法如下:

const initalStateSorting = {
  sortKey: undefined,
  sortOrder: "ASC"
}

const createSortingReducer = (endpoint) => {
  const sorting = (state = {}, action = {}) => {
    switch (action.type) {
      case 'SET_SORT': {
        return {
          sortKey: action.payload.sortKey,
          sortOrder: action.payload.sortOrder
        }
      }
      case 'RESET_SORT': {
        return initalStateSorting
      }
      default:
        return initalStateSorting
    }
  }
  return (sorting)
}

用这个方法,我可以创建其他通用的 reducer:

const photos = createSortingReducer('photos')
const text = createSortingReducer('text')

const sorting = combineReducers({
  photos,
  text
})

export default sorting

此通用方法的问题在于,当我调用 'SET_SORT' 操作时,我正在为照片缩减器和文本缩减器设置排序。

有没有办法将输入动作过滤到相应的端点?哪个是实现此目标的好方法?

在 reducer 中,您可以创建一个对象并设置相应的特定端点 reducer 的值,即对于照片传递照片并设置与照片对应的排序,例如 - 在 reducer 中创建这样的对象

{ 
  ...state,{ 
        photos:{ 
        sortKey: action.payload.sortKey,
        sortOrder: action.payload.sortOrder
        }
    }
}

类似地对文本做,然后你可以先从端点对应的状态中过滤值,然后设置它的值,这样你就不会复制多个。

最后我决定采用以下解决方案:

这里有动作创作者:

import { createAction } from 'redux-actions'

const createSorting = (endpoint) => {
  const setSort = (sort) => {
    return {
      type: `SET_SORT_${endpoint}`,
      payload: {
        sortKey: sort.sortKey,
        sortOrder: sort.sortOrder
      }
    }
  }
  const resetSort = () => {
    return {
      type: `RESET_SORT_${endpoint}`
    }
  }
  return {
    setSort,
    getSort,
    resetSort
  }
}


export const testSorting = createSorting('TEST')

并且,reducer 可以使用每个创建的键创建。这个想法是你将有一个独立的动作接收器(也许在未来的 redux 版本中有决定这个的选项会更好)。这是示例:

import { combineReducers, createStore } from 'redux'
import { handleActions } from 'redux-actions'
import Immutable from 'immutable'

const SORT_ASC = 'asc'
const SORT_DESC = 'desc'
const defaultSortOrder = SORT_ASC

const initalStateSorting = {
  sortKey: undefined,
  sortOrder: defaultSortOrder
}

const test= handleActions({
  SET_SORT_TEST: (state, action) => {
    return {
      sortKey: action.payload.sortKey,
      sortOrder: action.payload.sortOrder
    }
  },
  RESET_SORT_TEST: (state, action) => {
    return initalStateSorting
  },
}, initalStateSorting)

const sorting = combineReducers({
  test
})

export default sorting