个性化阅读
专注于IT技术分析

redux reducer – Redux教程

上一章Redux教程请查看:redux纯函数

还原是Redux中的一个纯函数,纯函数是可预测的,还原是改变还原状态的唯一方法,这是你唯一可以写逻辑和计算的地方,reduce函数将接受app的前一个状态和正在调度的动作,计算下一个状态并返回新对象。

以下几件事不应该在Reducer内部执行

  • 函数变元
  • API调用和路由逻辑
  • 调用非纯函数,如Math.random()

以下是Reducer的语法:

(state,action) => newState

让我们继续在web页面上显示产品项列表的示例,该示例在action creator模块中讨论。让我们看看下面如何写Reducer:

const initialState = {
    isLoading: false,
    items: []
 };
 const reducer = (state = initialState, action) => {
    switch (action.type) {
       case 'ITEMS_REQUEST':
          return Object.assign({}, state, {
             isLoading: action.payload.isLoading
          })
       case ‘ITEMS_REQUEST_SUCCESS':
          return Object.assign({}, state, {
             items: state.items.concat(action.items),
             isLoading: action.isLoading
          })
       default:
          return state;
    }
 }
 export default reducer;

首先,如果你没有设置状态为“initialState”,Redux会调用未定义状态的reduce。在这个代码示例中,在’ ITEMS_REQUEST_SUCCESS’中使用了JavaScript的concat()函数,它不会更改现有的数组;而是返回一个新数组。

这样,就可以避免状态的突变,在“ITEMS_REQUEST”中,我们必须从接收的动作中设置状态值。

我们已经讨论过,我们可以把逻辑写在Reducer,并可以分割它的逻辑数据基础。让我们看看如何在处理大型应用程序时拆分Reducer并将它们作为根Reducer组合在一起。

假设我们要设计一个web页面,用户可以在其中访问产品订单状态并查看愿望列表信息。我们可以将逻辑分离到不同的reduce文件中,使它们独立工作。让我们假设GET_ORDER_STATUS动作被分派来获取与某个订单id和用户id对应的订单状态。

/reducer/orderStatusReducer.js
import { GET_ORDER_STATUS } from ‘../constants/appConstant’;
export default function (state = {} , action) {
   switch(action.type) {
      case GET_ORDER_STATUS:
         return { ...state, orderStatusData: action.payload.orderStatus };
      default:
         return state;
   }
}
类似地,假设分派GET_WISHLIST_ITEMS动作来获取用户各自的愿望列表信息。
/reducer/getWishlistDataReducer.js
import { GET_WISHLIST_ITEMS } from ‘../constants/appConstant’;
export default function (state = {}, action) {
   switch(action.type) {
      case GET_WISHLIST_ITEMS:
         return { ...state, wishlistData: action.payload.wishlistData };
      default:
         return state;
   }
}

现在,我们可以结合这两个还原剂使用Redux联合诱导器的效用。该组合器生成一个函数,该函数返回一个对象,该对象的值是不同的Reducer函数。你可以导入index reduce文件中的所有还原器,并将它们作为一个对象与它们各自的名称组合在一起。

/reducer/index.js
import { combineReducers } from ‘redux’;
import OrderStatusReducer from ‘./orderStatusReducer’;
import GetWishlistDataReducer from ‘./getWishlistDataReducer’;

const rootReducer = combineReducers ({
   orderStatusReducer: OrderStatusReducer,
   getWishlistDataReducer: GetWishlistDataReducer
});
export default rootReducer;

现在,你可以将这个rootReducer传递给createStore方法,如下所示

const store = createStore(rootReducer);
赞(0)
未经允许不得转载:srcmini » redux reducer – Redux教程

评论 抢沙发

评论前必须登录!