前言:

  目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用。虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的学习react的历程。

redux:(http://www.redux.org.cn/)

  简单来看,redux基本使用就是这样,create一个store出来,然后通过dispatch action,通过reducer来改变这个store。  

const reducer = combinReducers(reducer1,reducer2)
const sotre = createStore(reducer)//创建store store.getState();
store.dispatch(action)

  API:

  1、createStore(reducer,initState,enhancer)

      reducer:根reducer,reducer函数接受(state,action),返回新state

      initState:初始化的state

       enhancer:

          官方说明:是一个组合 store creator 的高阶函数,返回一个新的强化过的 store creator。这与 middleware 相似,它也允许你通过复合函数改变 store 接口

          参考:https://segmentfault.com/a/1190000012653724

          自己理解:强化的store creator,返回一个函数,这个函数接收(reducer,inistate,enhancer)然后再在函数内部实现对store创建过程的一个扩展。

  2、store

      store.getState();

      store.dispatch(action);

      store.subscribe(listen);

      store.replaceReducer(nextReducer)

  3、combinReducers(reducer1,reducer2)

  4、applyMiddleware(...middlewareArr):

    中间件,用于扩展redux的dispatch,每一个middleware都接收middleware(dispatch,getState),返回一个fun,函数签名:({ getState, dispatch }) => next => action

  5、buildActionCreator

  6、compose

redux的三大原则:唯一数据源、store为只读、纯函数修改store(reducer)

异步:redux-thunk

applyMiddleware(thunk),把action变成接受dispatch和getState参数的函数,在函数内部进行异步操作,然后直接dispatch(asyncAction);

function asyncAction(){
return (dispatch,getState)=>{
if(getState().someCoditions){
return Promise.resolve();
}
dispatch(
makeASandwichWithSecretSauce('My Grandma')
).then(() =>
Promise.all([
dispatch(makeASandwichWithSecretSauce('Me')),
dispatch(makeASandwichWithSecretSauce('My wife'))
])
).then(() =>
dispatch(makeASandwichWithSecretSauce('Our kids'))
).then(() =>
dispatch(getState().myMoney > 42 ?
withdrawMoney(42) :
apologize('Me', 'The Sandwich Shop')
)
);
}
}

中间件:redux的中间件是在action发起的开始,到达reducer之前的扩展

redux-thunk:中间件,可以接受action为一个函数,然后再函数中做异步操作

action creater:

  在看http://www.redux.org.cn/docs/react-redux/之前,我也基本认为action creater基本是脱裤子放屁的事,

因为在我看来   dispatch({type:xxx,payload:xxx})是更直观的简单的,而dispatch(someFun(xxx)),做的事是一毛一样的就显得多余

但是

原因是没遇上真正需要用它的场景啊,还是那句话,如果你觉得这种方式对你没什么用处,那就说明你不需要它,

如果现在有个需求,在dispatch一个addTodo的action的时候,需要做很多验证,或者需要在addTodo之后去dispatch另一个查询的action,那么这时候就可以通过func的形式,将这部分相关代码写在一起,这样就不需要在每个dispatch的地方只需要dispatch这个actionCreator就行了。

衍生:action creator 生成器

  如果所有的action creator都是 func ()=>{type:xxx,payload:xxx}这样就会有很多这样的代码,简单而厌烦

  action creator生成器 接受(type,args)返回一个action,如:(type,args) => {return {type:xxx,payload:args}} ,然后其他的action creator就可以  const addTodo = fun(xxx,xxx);有效减少代码。

react系列笔记:第一记-redux的更多相关文章

  1. react系列笔记1 用npx npm命令创建react app

    react系列笔记1 用npx npm命令创建react app create-react-app my-app是开始构建新的 React 单页应用程序的最佳方式.它已经为你设置好了开发环境,以便您可 ...

  2. react系列(四)Redux基本概念和使用

    Redux基本概念和使用 先从Flux开始 先放一个Flux官网的链接.需要fq. Flux是Facebook提出的一种构建客户端网页应用的应用架构,它是一种抽象程度很高的设计模式,鼓励单向数据流. ...

  3. react系列笔记:第三记-redux-saga

    github : https://github.com/redux-saga/redux-saga 文档:https://redux-saga.js.org/ redux-saga:  redux中间 ...

  4. react系列笔记:第二记-中间件

    中间件所做的事情就是在action发起后,到reducer之前做扩展,实现的方式是对store的dispatch进行包装 store.dispatch => [middlewales] => ...

  5. react系列(六)Redux Saga

    在Redux中常要管理异步操作,目前社区流行的有Redux-Saga.Redux-thunk等.在管理复杂应用时,推荐使用Redux-Saga,它提供了用 generator 书写类同步代码的能力. ...

  6. react系列教程

    这个系列将从基础语法讲起,把react全家桶都讲到,然后到具体的使用,最后完成后,会写一个完整的demo. 前置要求: 基本的CSS,JS要熟练. 部分ES6语法需要了解.可以参考下面提到的阮一峰老师 ...

  7. React 系列教程 1:实现 Animate.css 官网效果

    前言 这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果.对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就 ...

  8. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  9. 跟着鸟哥学Linux系列笔记2-第10章VIM学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...

随机推荐

  1. Web 端异步下载文件

    Web 端异步下载文件 实现文件异步下载: 在服务端无法返回文件,或发生异常时给予提示. JavaScript: 服务端返回的JSON对象形如: { code:200, msg:'下载成功|未找到指定 ...

  2. CMS收集器产生的问题和解决方案

    垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况发生. 提升 ...

  3. Java NIO 系列学习(一)Java NIO概述

    参考资料: http://www.importnew.com/19816.html http://ifeve.com/overview/ NIO 三大核心部分: Channel(通道).Buffer( ...

  4. hdu 4856 Tunnels 状态压缩dp

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  5. sqlserver存储过程的使用

    参考网址:https://www.cnblogs.com/chaoa/articles/3894311.html(存储过程)    https://www.cnblogs.com/selene/p/4 ...

  6. MATLAB 符号变量表达式 + 方程求解

    源代码见文末 部分源代码: % 符号变量 两种表达方式 a=sym('a'); class(a); syms b; b; % 符号常量 c=sym('); c; % 符号表达式 三种表达方式 f1=' ...

  7. Oracle中用户的创建和权限设置

    权限: CREATE SESSION --允许用户登录数据库权限 CREATE TABLE --允许用户创建表权限 UNLIMITED TABLESPACE --允许用户在其他表空间随意建表 角色: ...

  8. JVM调优之JMeter使用(三)

    JMeter是Apache 下基于Java 的一款性能测试和压力测试工具.它基于Java 开发,可对HTTP 服务器和FTP服务器,甚至是数据库进行压力测试. 下载地址:http://jmeter.a ...

  9. 记一次mybatis bindingexception 问题排查

    看到的错误信息如出一辙都是这样的:Method threw 'org.apache.ibatis.binding.BindingException' exception.Invalid bound s ...

  10. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...