在 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
及其变体。
你好!
我正在尝试使用 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
及其变体。