深入Redux--Redux原理及应用三大原则

1,595 阅读2分钟

Redux工作原理

Redux通过store来管理全局的状态;

视图产生操作后会生成一个action,通过dispatch(action)这个方法派发给store;

store会将当前的状态和此次的action交给reducer处理,reducer处理后需要返回新的状态,此时store就能得知数据的变化,然后回通知视图获取最新的数据;

基本概念和api

Store

Store 就是用来维持应用所有的 state 树 的一个对象。

改变 store 内 state 的惟一途径是对它 dispatch 一个 action。

整个应用只能有一个 Store。

store方法
提供 getState() 方法获取 state;
提供 dispatch(action) 方法更新 state;
通过 subscribe(listener) 注册监听器;
通过 subscribe(listener) 返回的函数注销监听器。

Reducer

reducer其实就是一个纯函数。

它接收两个参数,第一个参数是需要管理的状态state,第二个是action。

reducer会根据传入的action的type值对state进行不同的操作,然后返回一个新的state,而不是在原有state的基础上进行修改,但是如果遇到了未知的(不匹配的)action,就会返回原有的state,不进行任何改变。

const reducer =(state,action)=>{
  switch(action.type){
    case ADD_TODO:
        return newstate;
    default return state
  }
}

Action

action本质是一个对象;

它是 store 数据的唯一来源。它会运送数据到 Store。

const action={
  type:'ADD_TODO',
  payload:'redux原理'
}

应用时的三大原则

在我们使用redux时,需要遵守这三大原则,则可以避免90%的bug:

  • 单一的数据源

我们把Store看成一个全局对象,而这个对象是唯一的,所有的状态都在Store这个状态树中'统一配置'

  • State是只读的

想要改变State必须通过Action,而具体使action在state上更新生效的是reducer;

这样确保了 视图 和 网络请求 都不能直接修改 state,相反它们只能表达想要修改的意图。

  • Reducer必须是一个纯函数

Reducer内部的执行操作必须是无副作用的,不能对state进行直接修改,当状态发生变化时,需要返回一个全新的对象代表新的state。

这样确保了同样的State,必定得到同样的 View。

需要遵守的是:

不得改写参数
不能调用系统 I/O 的API
不能调用Date.now()或者Math.random()等不纯的方法,因为每次会得到不一样的结果