用于单个模块内大状态的 Redux reducer 设计
Redux reducer design for large state within a single module
我遇到过两种用于在单个模块中处理大型状态的减速器设计。
第一种方法是将所有变量都放在一个大状态中并具有一个 reducer 函数。
const initialState = {
results: [],
pagination: {},
filters: [],
appliedFilters = [],
}
const reducer = (st = { ...initialState }, action) => {
const state = st;
switch (action.type) {
case 'SEARCH':{
return {
...state,
results: action.results,
pagination: action.pagination,
filters: action.filters,
appliedFilters: action.appliedFilters
},
case 'APPLY_FILTER':{
return {
...state,
results: action.results,
pagination: action.pagination,
filters: action.filters,
appliedFilters: action.appliedFilters
},
case 'PAGINATE':{
return {
...state,
results: action.results,
pagination: action.pagination,
}
}
第二种方法是为数据中的子项设置多个缩减器。
export function applications(state = [], { type, results}) {
switch (type) {
case SEARCH:
return results;
case INIT_RESULTS:
return [];
default:
return state;
}
}
export function pagination(state = null, { type, paginationData }) {
switch (type) {
case SEARCH:
return paginationData;
default:
return state;
}
}
export function filters(state = [], { type, filterData }) {
switch (type) {
case SEARCH:
return filterData;
case UPDATE_FILTERS:
return filterData;
default:
return state;
}
}
我认为两者各有利弊。考虑到可扩展性和模块化,哪个更好?
总的来说,这两者都与我们的官方建议相去甚远。
- 每个sub-state你应该有一个“切片”reducer(这排除了你的第一个选项
- 你不应该把 reducer 当作“设置一个值”,而是把整个“计算如何获取值”移到 reducer 中,把你的 action 当作“描述一个发生的事件”来处理
- 您应该使用我们推荐和教授的官方 Redux 工具包作为编写 Redux sinde 2019 的默认方式。说真的,看看它。它大约是代码的 1/4。没有更多的 switch..case 减速器或 ACTION_TYPES.
请给出Redux Style Guide a read and to learn modern Redux with Redux Toolkit, please follow the official Redux Tutorial
我遇到过两种用于在单个模块中处理大型状态的减速器设计。 第一种方法是将所有变量都放在一个大状态中并具有一个 reducer 函数。
const initialState = {
results: [],
pagination: {},
filters: [],
appliedFilters = [],
}
const reducer = (st = { ...initialState }, action) => {
const state = st;
switch (action.type) {
case 'SEARCH':{
return {
...state,
results: action.results,
pagination: action.pagination,
filters: action.filters,
appliedFilters: action.appliedFilters
},
case 'APPLY_FILTER':{
return {
...state,
results: action.results,
pagination: action.pagination,
filters: action.filters,
appliedFilters: action.appliedFilters
},
case 'PAGINATE':{
return {
...state,
results: action.results,
pagination: action.pagination,
}
}
第二种方法是为数据中的子项设置多个缩减器。
export function applications(state = [], { type, results}) {
switch (type) {
case SEARCH:
return results;
case INIT_RESULTS:
return [];
default:
return state;
}
}
export function pagination(state = null, { type, paginationData }) {
switch (type) {
case SEARCH:
return paginationData;
default:
return state;
}
}
export function filters(state = [], { type, filterData }) {
switch (type) {
case SEARCH:
return filterData;
case UPDATE_FILTERS:
return filterData;
default:
return state;
}
}
我认为两者各有利弊。考虑到可扩展性和模块化,哪个更好?
总的来说,这两者都与我们的官方建议相去甚远。
- 每个sub-state你应该有一个“切片”reducer(这排除了你的第一个选项
- 你不应该把 reducer 当作“设置一个值”,而是把整个“计算如何获取值”移到 reducer 中,把你的 action 当作“描述一个发生的事件”来处理
- 您应该使用我们推荐和教授的官方 Redux 工具包作为编写 Redux sinde 2019 的默认方式。说真的,看看它。它大约是代码的 1/4。没有更多的 switch..case 减速器或 ACTION_TYPES.
请给出Redux Style Guide a read and to learn modern Redux with Redux Toolkit, please follow the official Redux Tutorial