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中的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;

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?