dljia
  • 前言
  • es6
    • promise
    • 箭头函数
  • http相关
    • ajax请求中contentType和dataType
    • async和defer的区别
    • cookie、session和token
    • http协议介绍
    • http缓存
    • 转发和重定向
  • js
    • 1-js深浅复制
    • 10-节流防抖
    • 11-Promise常见手写
    • 2-js函数值传递
    • 3-js原型链详解
    • 4-js基础讲解this篇
    • 5-call、apply和bind
    • 6-js中的继承
    • 7-闭包与立即执行函数
    • 8-js事件循环
    • 9-js模块化
  • react
    • React-diff
    • React-fiber
    • React组件设计规则
    • mvc与mvvm
    • react-router
    • react懒加载
    • redux
    • setState源码分析
    • webpack+react从0项目构建
  • ts
    • Typescript编程书籍导读
    • 体操基础
  • 其他
    • gitbook简易配置教程
    • gitbook转pdf电子书
  • 微前端
    • pnpm
    • qiankun
    • single-spa源码分析
    • 几种微前端架构的选型
  • 转载
    • interview-1
    • interview-2
    • interview-3
    • 经验好文
  • 项目经验
    • 23年总结
    • [Arkts 学习笔记](项目经验/Arkts 学习笔记.md)
    • Grafana插件
    • JSDoc
    • electron-builder构建的安装包,安装时通过nsis脚本自动导入注册表
    • overflow-yautohiddenscroll和overflow-xvisible组合渲染异常
    • webpack
    • 前端工程化
    • 前端性能优化思路
    • 前端性能监控工具
    • 前端架构
    • 前端登录流程
    • 前端监控原理
    • 团队管理
    • 基于node实现简单server
    • 如何对业务进行深挖
    • 如何拉齐横向
    • 如何画图
    • 如何记录
    • 组件库
Powered by GitBook
On this page
  • 设计思想
  • 核心概念
  • 整体流程
  • 如何使用中间件
  • 异步操作
  • redux-promise
  • redux-thunk
  • redux-sega
  • 三种方法差异
  • react-redux
  • redux-actions
  • 实现原理

Was this helpful?

  1. react

redux

Previousreact懒加载NextsetState源码分析

Last updated 5 years ago

Was this helpful?

不适用于小白

设计思想

(1)Web 应用是一个状态机,视图与状态是一一对应的。 (2)所有的状态,保存在一个对象里面。

核心概念

  1. Store

    Store 就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store。

  2. reducer

    纯函数用来修改Store中存储的数据值。注意reducer中传入的state值是不可修改的

    实际项目中reducer可以通过combineReducers拆分

  3. action

    行为,用来触发reducer,action分为两个参数 一个type 一个payload。payload必须是普通对象

整体流程

首先,用户发出 Action。

 store.dispatch(action);

然后,Store 自动调用 Reducer,并且传入两个参数:当前 State 和收到的 Action。 Reducer 会返回新的 State 。

 let nextState = todoApp(previousState, action);

State 一旦有变化,Store 就会调用监听函数。(新版reducer已经用不到监听了)

// 设置监听函数
store.subscribe(listener);

listener可以通过store.getState()得到当前状态。如果使用的是 React,这时可以触发重新渲染 View。

    function listerner() {
     let newState = store.getState();
     component.setState(newState);   
    }

如何使用中间件

const store = createStore(
  reducer,
  applyMiddleware(promise,logger) // 中间件引入的先后顺序
);

异步操作

首先各种异步中间件原理都大体相同,即使用redux中间件函数,统一拦截发出得dispatch。不同异步中间做了不同处理

redux-promise

import isPromise from 'is-promise'; 
import { isFSA } from 'flux-standard-action'; 

export default function promiseMiddleware({ dispatch }) { 
  return next => action => { 
    if (!isFSA(action)) { 
      return isPromise(action) ? action.then(dispatch) : next(action); 
    } 

   return isPromise(action.payload) 
    ? action.payload 
    .then(result => dispatch({ ...action, payload: result })) 
     .catch(error => { 
       dispatch({ ...action, payload: error, error: true }); 
       return Promise.reject(error); 
     }) 
     : next(action); 
   }; 
 }

这个中间件使得store.dispatch方法可以接受 Promise 对象作为参数。如果接到得是promise对象则根据promise对象得执行结果去触发action

redux-thunk

function createThunkMiddleware(extraArgument)
 { 
   return  ({ dispatch, getState }) => next => action => { 
     if (typeof action === 'function') { 
       return action(dispatch, getState, extraArgument); 
     } 
     return next(action); 
   }; 
 } 
 const thunk = createThunkMiddleware(); 
 thunk.withExtraArgument = createThunkMiddleware; 
 export  default thunk;

判断action的参数是不是一个函数,如果是函数则将action的参数

redux-sega

通过generator处理异步,更细致的颗粒度

三种方法差异

redux-promise 写发简单。redux-thunk模板代码太多 redux-saga复杂但是颗粒度比较细

react-redux

redux-actions

实现原理

参考文章

阮一峰redux系列
bg2016091802