在 redux reducer 中使用 ramda 的 evolve

Using ramda's evolve in redux reducer

你好!

我正在尝试使用 FP 技术更改我的 reducer 代码 (ramda.js) 但我对 Ramda.evolve() 有疑问。这是代码: (为简单起见,我添加了两个要调度的操作)

/**
 Global reducer:
 Handles state management for global operations
 **/

"use strict";

import initialState from "./initialState";
import * as R from "ramda";
import {
  SET_MODE
} from "../constants/ActionTypes";

let { packages, ...globalState } = initialState;

//currying
const createReducer = (globalState, handlers) => (state = globalState, action) =>
  R.propOr(R.identity, R.prop("type", action), handlers)(state, action);


const handlers = {
  [SET_MODE]: (state, action) =>
    R.evolve(
      {
        mode: action.mode,
        directory: action.directory
      },
      state
    ),
  [TOGGLE_LOADER]: (state, action) => R.assoc("loading", action.loading, state)
};

const reducer = createReducer(globalState, handlers);
export default reducer;

(R = Ramda)

R.assoc 工作正常,但 R.evolve 没有..它没有 return 具有新值的状态,它只是 return 的默认状态. 我做错了什么?

http://ramdajs.com/docs/#evolve

http://ramdajs.com/docs/#assoc

提前致谢

R.evolve does not

这是进化的签名

 {k: (v → v)} → {k: v} → {k: v}

它需要一个函数字典。您正在传递值字典。这应该有效(虽然是多余的)

R.evolve({
  mode: () => action.mode,
  directory: () => action.directory
}, state)

添加

如果您需要一次更新多个道具,您可以使用 merge 及其变体。