zoukankan      html  css  js  c++  java
  • [Redux] Understand Redux Higher Order Reducers

    Higher Order Reducers are simple reducer factories, that take a reducer as an argument and return a new reducer. In that new reducer, you can customize the behaviour of the original one which helps reducing the reducer logic.

    In this lesson, we'll see how to reduce duplicated code by refactoring two different reducers into a higher order reducer.

     

    Reducers:

    export default (state = [], { type, payload }) => {
      switch (type) {
         case "ADD_ARTICLE":
           return [...state, payload]
    
        default:
          return state
      }
    }
    export default (state = [], { type, payload }) => {
      switch (type) {
         case "ADD_USER":
           return [...state, payload]
    
        default:
          return state
      }
    }

    They both share the same code structure.

    HOC reducer:

    which is a reducer hoc function return a reducer function.

    import { combineReducers } from "redux"
    import users from "./users"
    import articles from "./articles"
    
    const addHoc = (reducer, predicate) => (state, action) => {
      if (predicate(action.type)) {
        return [...state, action.payload]
      }
      return reducer(state, action)
    }
    
    const rootReducer = combineReducers({
      users: addHoc(users, type => type === "ADD_USER"),
      articles: addHoc(articles, type => type === "ADD_ARTICLE")
    })
    
    export default rootReducer

    If match the predicate function, then we can compute the next state and return it. If doesn't match, then pass to the reducer normally. Then we can remove "ADD_USER" and "ADD_ARTICLE" cases from reducers.

    Personally I don't think this is a good approach... even it reduce the boilerplate code, but it decrease the code readability. I still prefer keep all the reducer logic inside the its reducer file. Just make a reuseable function would be better:

    export const append = (state, payload) => {
      return [...state, payload]
    }
    
    
    export default (state = [], { type, payload }) => {
      switch (type) {
         case "ADD_USER":
           return append(state, payload)
    
        default:
          return state
      }
    }

     It also make Unit testings easier.

  • 相关阅读:
    ActionBar Fragment的一个sample activity; 及获取runningAppProcess及跳转
    优化后台推送的service,减少被杀死的几率
    64位win7安装ubunto最新14.04的过程,及出现的问题的解决
    一次非线上iowait高的情况的检查
    一个愚蠢的python逻辑语法错误
    Bellman-Ford算法解决单源最短路问题
    Floyd算法解决多源最短路径问题
    最短路问题Dijkstra算法
    最小生成树之Kruskal算法
    最优二叉搜索树
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7524321.html
Copyright © 2011-2022 走看看