Redux 学习笔记1

150 阅读3分钟

虽然写了三年的 React,但是由于所负责项目规模都不是很大,一直未接触 Redux 进行 state 管理,近期新项目需要,所以根据官网系统的学习了 Redux。整理成文档,增加自己记忆。

动机

前端 SPA 越来越复杂,state 包括:服务器返回、本地产生、UI状态管理数据。这些数据互相影响,修改一个数据,可能引起其他并没有直接关联的UI更新。当业务很复杂,数据状态很多时候,普通的数据管理,开发者对数据管理失控,造成不必要的麻烦。所以需要引入一种数据管理机制,更好的对 state 进行管理。

核心概念

Redux 内置了发布订阅模块,组件之间数据交互不需要用 Props 一层层传递。应用的 state 统一放在 store 里面维护,当需要修改 state 的时候,dispatch 一个 action 给 reducer,reducer 算出新的 state 后,再将 state 发布给事先订阅的组件。

所有对状态的改变都需要 dispatch 一个 action,通过追踪 action,就能得出 state 的变化过程。整个数据流都是单向的,可检测的,可预测的。

State:用 object 表示,这个对象类似于一个 model,但是这个 model 没有 setter 方法,是未了防止不正确的暴力修改。

{
    obj1: {
        key1: 'val1',
        key2: 'val2'
    },
    obj2: {
        key3: 'val3'
    }
}

Action: 如果我们想要改变 state,那么我们需要发布一个 action,这个action需要包含:type 和 data。

{ type: 'ADD', text: '111' },
{ type: 'DELETE', text: '222' }

Reducer: 一个函数,参数为 state 和 action,监听action的广播,通过 action 的 type 判断更新的饿类型,然后 action 的数据来更新 state,返回新的 state 最后由框架告知所有订阅这个 state 的组件,进行组件的更新。

function reducer1 (state={}, action) {
    if (action.type === 'ADD') {
        state.key2 = action.text;
    } else {
        return state;
    }
}

以上为 Redux 的设计理念,将所有的state进行统一管理,使用者只要关心自己 view 是依赖哪个 state 字段,需要更新的时候,dispatch 一个 action, 然后 reducer 返回新的 state 就可以。

三个基本原则

  1. 单一数据源

所有的State都是存储于一个Store内。 这样做的原因:服务器端返回的数据可以直接传递给客户端,不需要编写额外的代码;单一 state 树使调试变得更加便捷。undo、 redo 等不好实现的方法,由于存于一个 state 树,可以马上实现了。

  1. State 是 只读的。

更改 state 只能通过发布 action (一个 object 描述这个更改的类型和需要的数据)。

无论 view 还是 server, 都无法直接更改 state, 只能通过 action 这个 object 来进行更改,由于 object 更利于记录、序列化、存储,所以对于调试和测试更加方便。

  1. Reducer 是 纯函数

接收 action, 如何转换 state 树,你需要编写纯函数。

Reducer 接收 action 和 前一个 action, 最后返回一个新的 state, 他是一个纯函数。记住,他是返回了一个新的 state, 而不是修改前一个state。 开发时,可以先编写一个简单的函数,然后后期进行扩充和优化,可以拆分,可以合并,可以公用。

总结

根据官网文档,简单的看了下Redux的核心概念和三个原则,对于Redux有了大致了解。后面继续学习:Redux简单使用、React-redux的实现原理、最新的context 和 redux 的对比。