Redux:在reducer函数中调用store.getState(),这是一种反模式吗?

Kas*_*per 14 javascript redux

我想知道,有时我有一台需要另一台减速机信息的减速机.例如,我有这个减速器:

import * as ActionTypes from '../actions/action_type_constants';
import KeyCode from 'keycode.js/index';
import {store} from "../index";
import {mod} from "../pure_functions";

export function selectedCompletion(state = 0, action) {
  if (action.type === ActionTypes.arrowKeyPressed) {
    const completionsLength = store.getState().completions.data.length;
    if (action.keyCode === KeyCode.UP) {
      return mod(state - 1, completionsLength);
    } else if (action.keyCode === KeyCode.DOWN) {
      return mod(state + 1, completionsLength);
    }
  }
  return state;
}
Run Code Online (Sandbox Code Playgroud)

我在函数的第二行调用store.getState,否则我无法正确确定索引.

我可以重构这个和另一个减速器,以便它成为一个大的减速器,但为了可读性,我更喜欢这个选项.

如果我在reducer中使用这种调用store.getState()的模式,我不确定是否会以某种方式解决问题.

mar*_*son 16

是的,这绝对是一种反模式.Reducer功能应该是"纯粹的",并且只能基于它们的直接输入(当前状态和动作).

Redux FAQ在关于reducers之间共享状态的 FAQ中讨论了这类问题.基本上,您应该编写一些自定义的reducer逻辑,传递所需的其他信息,或者将更多信息添加到您的操作中.

我还为Redux文档编写了一个名为Structuring Reducers的部分,该部分讨论了与reducer逻辑相关的一些重要概念.我鼓励你仔细阅读.