reducer

作者: 高静最近在长脑子 | 来源:发表于2017-08-15 14:48 被阅读13次

Redux 本身很简单。

当使用普通对象来描述应用的 state 时。例如,todo 应用的 state 可能长这样:

{
  todos: [{
    text: 'Eat food',
    completed: true
  }, {
    text: 'Exercise',
    completed: false
  }],
  visibilityFilter: 'SHOW_COMPLETED'
}

这个对象就像 “Model”,区别是它并没有 setter(修改器方法)。因此其它的代码不能随意修改它,造成难以复现的 bug。

要想更新 state 中的数据,你需要发起一个 action。Action 就是一个普通 JavaScript 对象(注意到没,这儿没有任何魔法?)用来描述发生了什么。下面是一些 action 的示例:

{ type: 'ADD_TODO', text: 'Go to swimming pool' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }

强制使用 action 来描述所有变化带来的好处是可以清晰地知道应用中到底发生了什么。如果一些东西改变了,就可以知道为什么变。action 就像是描述发生了什么的面包屑。最终,为了把 action 和 state 串起来,开发一些函数,这就是 reducer。再次地,没有任何魔法,reducer 只是一个接收 state 和 action,并返回新的 state 的函数。 对于大的应用来说,可能很难开发这样的函数,所以我们编写很多小函数来分别管理 state 的一部分:

function visibilityFilter(state = 'SHOW_ALL', action) {
  if (action.type === 'SET_VISIBILITY_FILTER') {
    return action.filter;
  } else {
    return state;
  }
}

function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    return state.concat([{ text: action.text, completed: false }]);
  case 'TOGGLE_TODO':
    return state.map((todo, index) =>
      action.index === index ?
        { text: todo.text, completed: !todo.completed } :
        todo
   )
  default:
    return state;
  }
}

再开发一个 reducer 调用这两个 reducer,进而来管理整个应用的 state:

function todoApp(state = {}, action) {
  return {
    todos: todos(state.todos, action),
    visibilityFilter: visibilityFilter(state.visibilityFilter, action)
  };
}

这差不多就是 Redux 思想的全部。注意到没我们还没有使用任何 Redux 的 API。Redux 里有一些工具来简化这种模式,但是主要的想法是如何根据这些 action 对象来更新 state,而且 90% 的代码都是纯 JavaScript,没用 Redux、Redux API 和其它魔法。

相关文章

  • reducer

    Redux 本身很简单。 当使用普通对象来描述应用的 state 时。例如,todo 应用的 state 可能长这...

  • Redux 源码初探

    标签: 源码解析,前端 Redux 1. Reducer combineReducers将多个reducer 合并...

  • Reducer Hook

    Reducer Hook Flux:Facebook出品的一个数据流框架 规定了数据是单向流动的 数据存储在数据仓...

  • redux基础

    初始化 1、通过reducer创建store,store=create(reducer,initValues)将s...

  • redux数据操作

    action,reducer,store与页面之间的数据传递 action代码: reducer代码:rootRe...

  • 弄清原理之Redux combineReducers

    Redux reducer的作用 只用来处理state 变化,返回新的state reducer composit...

  • Redux中间件(一):redux的使用

    Redux Redux是基于Reducer来实现 Reducer 来自数组(Array)中的reduce 例如数据...

  • 2021-02-27 Redux(2) : 深入理解Store、

    理解Store Dispatcher分发Action到Reducer,Reducer根据对应的动作生成新的stat...

  • MapReduce八股文

    Mapper Reducer Runner

  • Redux

    (1)reducer reducer 只是一个接收 state 和 action,并返回新的 state 的函数。...

网友评论

      本文标题:reducer

      本文链接:https://www.haomeiwen.com/subject/qrxvrxtx.html