Redux&dva

363 阅读2分钟

Redux出现的背景

在React中数据流是单向的,顶层组件可以通过props属性向下传递数据,但是下层组件不能向上层组件传递数据.

若实现下层组件修改数据,需要上层组件传递修改数据的方法到下层组件,项目变得复杂时,数据传递就会很困难

使用Redux管理数据,由于Store独立于组件,使得数据管理独立于组件,解决了组件间的数据传递问题

Redux核心API

// 创建 Store 状态容器
const store = Redux.createStore(reducer)
// 创建用于处理状态的 reducer 函数
function reducer(state = initialState, action) {}
// 获取状态
store.getState();
// 订阅状态
store.subscribe(function() {})
// 触发Action
store.dispatch({type: 'description...'})

Redux工作流程

image.png

  • Store: 是一个单一的数据源,而且是只读的
  • Action: 对变化的描述
  • Reducer: 负责对变化即逆行分发和处理,最终将新的数据返回给store

Redux核心代码

React+Redux工作流程

create-react-app ---| react-redux

Redux中间件

image.png

当一个中间件执行完成后,调用next方法,传递给第二个中间件,第二个中间调用next方法传递给reducer

Redux引入异步数据流

Redux-thunk

下图贴一段thunk的核心代码

function createThunkMiddleware(extraArgument) {
  return ({ dispatch, getState }) => (next) => (action) => {
    // 如果传递的时一个函数,则为异步操作,异步操作代码写在传递进来的函数中,
    // 中间件函数在调用传递进来的函数时,要将dispatch方法传递过去
    if (typeof action === 'function') {
      return action(dispatch, getState, extraArgument);
    }

    return next(action);
  };
}

const thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;

export default thunk;

Redux-saga

可以将异步操作从Action Creator文件中抽离出来,放在一个单独的文件中, dva就是基于redux和redux-saga的数据流方案

下面讲一下redux-saga的用法 1.创建redux-saga中间件

image.png 2. 注册sagaMiddleware

image.png 3. 使用saga接收action执行异步操作

image.png

  • takeEvery: 接收action
  • put: 触发另外一个action,如异步操作返回结果以后,通过put方法,将结果传递给reducer, 保存在store中