redux纯函数 – Redux教程

上一章Redux教程请查看:redux动作
函数是一个接受称为参数的输入并产生称为返回值的输出的过程,如果一个函数遵守下列规则,则称它为纯函数:

  • 函数对于相同的参数返回相同的结果。
  • 其计算没有副作用,即。,它不改变输入数据。
  • 局部和全局变量没有突变。
  • 它不像全局变量那样依赖于外部状态。
让我们以一个函数为例,它返回作为函数输入传递的值的两倍。一般写成f(x) => x*2。如果用参数值2调用一个函数,那么输出将是4,f(2) => 4。
让我们用JavaScript来编写函数的定义,如下所示:
const double = x => x*2; // es6箭头函数 console.log(double(2)); // 4

这里,double是一个纯函数。
【redux纯函数 – Redux教程】根据Redux中的三个原则,更改必须由一个纯函数完成,即, Redux中的reducer。现在,一个问题出现了,为什么一个reducer必须是一个纯函数。
假设,你希望通过单击add to cart按钮来分派一个类型为“ADD_TO_CART_SUCCESS”的操作,以便将一个项目添加到购物车应用程序中。
让我们假设reducer正在添加一个项目到你的购物车如下-
const initialState = { isAddedToCart: false; } const addToCartReducer = (state = initialState, action) => { //es6箭头函数 switch (action.type) { case 'ADD_TO_CART_SUCCESS' : state.isAddedToCart = !state.isAddedToCart; // 原始对象改变 return state; default: return state; } } export default addToCartReducer ;

让我们假设,isAddedToCart是状态对象上的一个属性,它允许你通过返回一个布尔值“true或false”来决定何时禁用“add to cart”按钮。这可以防止用户多次添加相同的产品。现在,我们不是返回一个新对象,而是像上面那样在状态上修改isAddedToCart prop。现在,如果我们试图添加一个项目到购物车,什么也不会发生。添加到购物车按钮将不会被禁用。
这种现象的原因是这样的:
Redux通过新旧对象的内存位置来比较新旧对象。如果发生了任何变化,它期望从reducer获得一个新对象。如果没有发生更改,它还希望取回旧对象。在本例中,它是相同的。由于这个原因,Redux假设什么都没有发生。
因此,在Redux中,reducer必须是一个纯函数。下面是一种没有突变的写法
const initialState = { isAddedToCart: false; } const addToCartReducer = (state = initialState, action) => { //es6箭头函数 switch (action.type) { case 'ADD_TO_CART_SUCCESS' : return { ...state, isAddedToCart: !state.isAddedToCart } default: return state; } } export default addToCartReducer;

    推荐阅读