前言:

  目前公司使用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. sort排序原理

    var array = [10,5,40,25,1000,1];   array.sort(compareFunction);   function compareFunction(a, b) {  ...

  2. Go-延时函数defer

    关于延时调用函数(Deferred Function Calls)      延时调用函数基本语法如下: defer func_name(param-list) {} 当一个函数前有关键字 defer ...

  3. heap_sort

    (from wikipedia) 构建步骤: 建成一个大顶堆 第一个元素依次和最后一个元素交换,由于交换后新的堆顶元素可能违反大根堆的性质,因此需要对当前无序区(1,2,...,n-1)调整为新堆 不 ...

  4. Activiti 工作流之所学所感(基本配置) DAY1

    由于公司需求,最近在研究工作流,在此记录一下所学所感以备往后使用时候可以方便查询,有不足之处请各位大牛提点,下面直接进入主题. 下载activiti 所需资料  可以直接在官网上下载,也可以在我的网盘 ...

  5. hadoop之数据压缩与数据格式

    * 注:本文原创,转载请注明出处,本人保留对未注明出处行为的责任追究. a.数据压缩 优点: 1.节省本地空间 2.节省带宽 缺点: 花时间 1.MR中允许进行数据压缩的地方有三个: 1)input起 ...

  6. 干货 | 揭秘如何增加listing多个类目节点

    流量是电商销售的必要因素,可以说,任何成功的电商平台都离不开流量.亚马逊listing优化做得好,不仅能提高产品的曝光率,还能提升转换率,而好的类目可以吸引大的流量.帮你快速爬升. 首先我们来了解一下 ...

  7. QT 右键弹出菜单

    QWidget及其子类都可有右键菜单 1.设置标志 在widget初始化的时候 setContextMenuPolicy(Qt::CustomContextMenu); 设置为自定义菜单模式 2.在需 ...

  8. vue作用域插槽的应用

    问题场景: 存在一个列表,然后当鼠标放入列表中的名称上的时候,自动弹出简介,类似这种效果, 我们当然可以使用positon relative和absolute搭配达到这样的效果,但是现在有一个奇葩的问 ...

  9. 用python算圆周率及进度条提示

    (一)圆周率 : (1)圆周率是指平面上圆的周长与直径之比 (ratio of the circumference of a circle to the diameter) .用符号π表示.中国古代有 ...

  10. 关于PHP的mkdir函数

    问题:dedecms5.7 php5.6 我想项目根目录下的uploads文件夹下动态创建一个文件夹/uploads/imgs $path = '/uploads/imgs'; mkdir($path ...