javascript - 如何重置使用相同 key 但不同操作的 reducer ?

标签 javascript reactjs ecmascript-6 redux react-redux

这是我当前的 reducer :

import { Reducer } from 'redux';
import {
  EventState,
  LOAD_EVENTS,
  LOAD_EVENT_BY_ID,
  FETCH_MORE_EVENTS
} from '../types/eventTypes';

export const initialState = {
  eventsList: [],
  event: undefined,
  isLastPage: false
};

const eventReducers: Reducer<EventState, any> = (
  state = initialState,
  action
) => {
  switch (action.type) {
    case LOAD_EVENTS:
      return {
        ...state,
        eventsList: action.eventsList
      };
    case FETCH_MORE_EVENTS:
      return {
        state,
        eventsList: state.eventsList.concat(action.eventsList),
        isLastPage: action.eventsList.length === 0
      };
    default:
      return state;
  }
};

export default eventReducers;

如您所见,LOAD_EVENTSFETCH_MORE_EVENTS 共享 key eventsList,在获取更多事件时,我正在调用这样的状态 state 而不是 ...state 因为它似乎重新初始化了整个 reducer 的状态。但是,这是正确的方法吗?我认为如果这个reducer长大了,那将是一个bug。

那么我该怎么做才能正确清洁该 reducer 呢?就像我所需要的那样, LOAD_EVENTS 触发,然后 eventsList 应该变得清晰,并通过 LOAD_EVENTS 带来的内容再次填写。基本上我只需要重置 eventsList 的状态,但其余部分应该保持不变。

最佳答案

当您调用诸如 state 而不是 ...state 这样的状态时,您不会重新初始化状态,而是将先前的状态存储在新状态中,就像下面这个例子:

state = {
  eventsList: [...someEvents],
  event: undefined,
  isLastPage: false,
  state: {
    eventsList: [...someEvents],
    event: undefined,
    isLastPage: false,
    state: {
      eventsList: [...someEvents],
      event: undefined,
      isLastPage: false
    }
  }
};

这不是一个好的模式/实践,除非非常必要。

所以正确的,当获取更多事件时,它会使用initialState重置之前的状态。

export const initialState = {
  eventsList: [],
  event: undefined,
  isLastPage: false
};

const eventReducers: Reducer<EventState, any> = (
  state = initialState,
  action
) => {
  switch (action.type) {
    case LOAD_EVENTS:
      return {
        ...state,
        eventsList: action.eventsList
      };
    case FETCH_MORE_EVENTS:
      return {
        ...initialState,
        eventsList: state.eventsList.concat(action.eventsList),
        isLastPage: action.eventsList.length === 0
      };
    default:
      return state;
  }
};

但怎么说呢,只需要重置 eventsList 的状态即可,其余部分保持不变,您可以对此 reducer 保持相同:

case LOAD_EVENTS:
  return {
    ...state,
    eventsList: action.eventsList
};

因为当您像上面的示例一样设置 eventsList 时,您将重置 eventsList 并再次填写新数据。但不要忘记我说的第一个例子的问题。

关于javascript - 如何重置使用相同 key 但不同操作的 reducer ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58142831/

相关文章:

javascript - 在数组中查找多个对象并添加到该对象的计数值

javascript - 提交后,b(array_name).map 不是函数 - ReactJS

javascript - 开 Jest 返回错误: SyntaxError: 'import' and 'export' may appear only with 'sourceType: "module"' (21:0)

javascript - 拼接函数将相同的元素插入到每个索引中

javascript - Array.sort() 方法在不同浏览器中的稳定性如何?

javascript - 将照片 slider 放入 Canvas 标签内

javascript - 输入上的 onChange 不会使用 setState 更新状态

Javascript 奇怪的生成器 yield 子函数行为

javascript - ES6 Javascript 中 IsInTailPosition() 的最终用户文档/说明

javascript - YQL 返回重复条目