react系列笔记:第一记-redux
前言:
目前公司使用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的更多相关文章
- react系列笔记1 用npx npm命令创建react app
react系列笔记1 用npx npm命令创建react app create-react-app my-app是开始构建新的 React 单页应用程序的最佳方式.它已经为你设置好了开发环境,以便您可 ...
- react系列(四)Redux基本概念和使用
Redux基本概念和使用 先从Flux开始 先放一个Flux官网的链接.需要fq. Flux是Facebook提出的一种构建客户端网页应用的应用架构,它是一种抽象程度很高的设计模式,鼓励单向数据流. ...
- react系列笔记:第三记-redux-saga
github : https://github.com/redux-saga/redux-saga 文档:https://redux-saga.js.org/ redux-saga: redux中间 ...
- react系列笔记:第二记-中间件
中间件所做的事情就是在action发起后,到reducer之前做扩展,实现的方式是对store的dispatch进行包装 store.dispatch => [middlewales] => ...
- react系列(六)Redux Saga
在Redux中常要管理异步操作,目前社区流行的有Redux-Saga.Redux-thunk等.在管理复杂应用时,推荐使用Redux-Saga,它提供了用 generator 书写类同步代码的能力. ...
- react系列教程
这个系列将从基础语法讲起,把react全家桶都讲到,然后到具体的使用,最后完成后,会写一个完整的demo. 前置要求: 基本的CSS,JS要熟练. 部分ES6语法需要了解.可以参考下面提到的阮一峰老师 ...
- React 系列教程 1:实现 Animate.css 官网效果
前言 这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果.对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就 ...
- 跟着鸟哥学Linux系列笔记3-第11章BASH学习
跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...
- 跟着鸟哥学Linux系列笔记2-第10章VIM学习
跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...
随机推荐
- 【Java基础】浅谈常见设计模式
Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...
- appium-android 遇到swipe函数无法使用的问题及解决办法
问题:cannot resolve method swipe() 问题出现原因:File->Project Structure->Modules->Dependencies-> ...
- Flutter安装之后cmd运行错误解决
当把Flutter环境变量配置之后,打开cmd输入:flutter 出现如下错误: 'MySQL' is not recognized as an internal or external comma ...
- wireshark基础学习—第一部分wireshark的基础知识
1.Wireshark主窗口 Wireshark的主窗口如下所示 2.每个面板的内容 Packet List(数据包列表): 最上面的面板用表格显示了当前不惑文件中的所有数据包,其中包括了数据包序号. ...
- 将nginx、mysql、php添加至环境变量
1.问题描述: 修改完nginx配置后想重启nginx服务,执行nginx -s reload 返回了 -bash: nginx: command not found 2.原因: 没有配置环境变量,找 ...
- Vue小项目二手书商城:(二)axios前后端数据交互
实现内容: 写路由接口(express) axios取数据 一.写接口 1.我们要在前端取到后端的数据(之前写的data.json)可以用vue-resourse或者用axios,在vue2之后官方就 ...
- vue--动画收缩
首先 install vuex 创建store文件夹 在 store 文件夹分别建立 state.js // 状态管理 // 定义state 原始数据 const state = { fullScre ...
- python2和python3的range(100)的区别
python2返回列表,python3返回迭代器,节约内存
- Apache和Nginx的区别
Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apa ...
- 详解MySQL中concat函数的用法(连接字符串)
MySQL中concat函数 使用方法: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制 ...