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
我已经完成了一种创建通用排序减速器的方法。这个想法是调用一个动作并通过 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