时间:2017-06-28 来源:

在React中使用Redux

这是Webpack+React系列配置过程记录的第六篇.其他内容请参考:

这篇文章的主要内容包括: 1. 修改一下之前存在的问题; 
2. 在框架中引入redux,使用一个例子简单介绍redux的使用方法; 
3. 其他redux辅助库.

修复遗留问题

  1. webpack.prod.config.js中缺少了对path库的引用,psd切图html执行构建npm run build:prod的时候失败.在文件开始的地方引入node.js的path库就可以了.
  2. package.json里面定义了一个build:dev的脚本,团队网页接活这个脚本其实有点多余,div切图排版不过有时候需要打包测试版本的文件div页面,这在使用npm start命令启动运行时打包的时候看不出问题div+css+js切图,publicPath: config.publicPath.
  3. css-loader和less-loader导出的样式类名太长承接网站前端,还是把localIdentName中的path部分去掉比较好看.

redux

安装redux

安装依赖的命令如下:

npm install --save redux react-redux redux-thunk  
npm install --save-dev redux-logger  

redux不用说了,页面div重构我是把它当成一个本地数据库使用psd切图html,react-redux帮助你完成数据订阅,psd切图htmlredux-thunk可以放你实现异步action,redux-logger是redux的日志中间件.

关于redux与代码布局

在开始介绍之前我想先就redux的使用发表一些自己的看法:

前文说了我把redux当成一个本地数据库,web外包因此我倾向于把redux封装类似于mvc中的Model的角色网页切图制作,独立为一层.这与另一种观点——我在公司的项目更倾向于把每个页面当成一个独立模块,div页面每个模块维护自己的reducer和action的观点div+css+js切图,有所出入.

我的做法可以更好地实现reducer的复用.而对我自己来说更重要的好处是集中修改.更适合小项目或者独自开发一个项目的场景.

我公司的项目的做法对多人协同开发更有利,div+css+js切图毕竟每个人维护好自己的代码就可以了.公司项目的这种方法有几个问题让我比较难以接受:

第一个是模块越多reducer和action的定义越多承接网站前端,很多时候这些代码都是差不多的.

更重要的是第二个问题:模块数据在store里面的存储是直接在根state下面排列下来的,承接网站前端根state的数据格式样式有点像这样:

{
    aModuleData:{...},
    cModuleData:{...},
    ...
}

项目的原意是希望每个模块的保持独立网页切图制作,但实际上使用的时候却是有极大的可能出现aModule同时使用aModuleData和bModuleData的情况.这跟每个人维护自己的代码的初衷有悖,手机页面切图排版也没有发挥好redux的真正能力.

还有一个小问题是reducer的组织通常影响着应用数据state的样式div+css+js切图,把reducer分散到每个模块之后,网页重构报价state的形式在代码上很难直管地反映出来承接网站前端,特别是当模块是动态加载的时候更甚.不过借助logger等工具可以解决.

关于这块的争议Redux的教程中有提及.

使用redux

无论代码怎么布局,承接网站前端使用redux的方法主要还是三步曲:创建store、创建action、创建reducer.而在这之后才是与业务或者组件相关的数据处理和展示.

先看一下我的做法的代码布局:

代码布局

创建store的代码集中在model/index.js中psd切图html,model/actions/.js和model/reducer/.js里面分别是写action创建函数和reducer函数的地方,psd切图html根据模块可以自己DIY.

model/index.js的代码如下:

model/index.js的代码

model/actions/index.js的代码如下:

model/actions/index.js的代码

这里定义了一个名叫login的异步actionCreator以及三个普通的actionCreator.

actionCreator被某个组件调用后会向store发送action,然后被reducer处理,div切图排版reducer定义在model/reducers/index.js中网页切图制作,代码如下:

model/reducers/index.js的代码

这就完成了三步曲了.上面的代码简单地模拟了登录的动作.登录页面用到的数据存放在loginPageData中,手机页面切图排版登陆后获取到的当前登录用户数据存储在实体数据entities中.

接下来要把redux和react联系起来div+css+js切图,为react提供数据支持.最简单的做法是找到应用的根组件(我这里是BasicExample.js),然后在它的render函数中最外层添加Providor标签.代码片段如下:

挂载redux的store到react

红线部分画出了改动点,页面div重构从model/index.js中导出了store对象psd切图html,通过react-redux提供的Providor标签挂载到react中,psd切图html为react提供数据支持.

看最后的红线中web外包,然后返回一个容器组件.connect函数通过第一个参数让展示组件订阅了来自store的数据;通过第二个参数让展示组件默认可以dispatch各种action.

这个例子在ReduxDemo挂载完成后调用login接口模拟登陆.返回结果被塞到store中(数据格式由先前写好的reducers的组织方式决定).页面根据store中的数据展示内容.由于login发出的远程请求是假的网页切图制作,所以这里总是失败,div页面因此会显示失败的内容.

关于redux的使用介绍到此结束.

redux辅助库

其实在上面的代码中我已经悄悄地提及了两个辅助库div+css+js切图,也是我想在这里推荐的两个库:

  1. 开发工具redux-devtools:结合各种其他库可以实现可视化的调试界面.
  2. 数据规范化工具normalizr:规范化组织数据.经过三个项目的体验后,div+css+js切图个人非常推荐使用这个库承接网站前端,可以让应用的数据组织更清晰、减少冗余数据、减少因数据刷新导致的性能影响.

暂时不在这里展开介绍,承接网站前端有兴趣的可以到github上查一下文档.

源码下载地址:https://pan.baidu.com/s/1dENYfuh

点击次数:3117
作者:
web前端行业资讯
Web new NewsList
Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日苹果经典电脑Lisa源代码修复完成将于2018年开源 ,,2017年12月28日腾讯浏览指数发布年终榜单2017年人们都关注哪些AI话题? ,,2017年12月28日除了发现开普勒90,NASA还靠AI做了什么? ,,2017年12月28日柯洁宣布:明年4月,将再次与围棋AI交锋 ,,2017年12月28日百度无人车美国首秀CES将发布Apollo2.0 ,,2017年12月28日这四种技术发展趋势将在2018年改变世界 ,,2017年12月28日2017:谷歌DeepMind团队的年度回顾 ,,2017年12月28日封杀这个公式,AI智商将为零 ,,2017年12月28日微软AI高管:要让所有人、所有机构都用上人工智能 ,,2017年12月28日为什么Linux桌面年一直未到来 ,,2017年12月28日AppleLisa操作系统将开源 ,,2017年12月28日2018年9大技术趋势预测 ,,2017年12月28日谷歌研究院发布NIMA:能评价图像有多美,还能让图像变得更美 ,,2017年12月28日苹果为2019年iPhone开发大容量电池新技术 ,,2017年12月28日谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日继“Angel”开源后,腾讯又开放TDinsight机器学习平台 ,,2017年12月21日Python学习笔记(4):正则表达式 【编程语言】2015年01月24日新闻发布系统,BS模式下的三层应用 【移动开发】2015年05月11日.net中使用xsl文件作为导航菜单的小例子2014年01月29日网页元素居中攻略记_(1)元素水平居中 【编程语言】2015年06月02日报表和图表开源项目fyiReporting 1,收藏 ,,2016年06月23日4.蛤蟆的计算机组成原理笔记四存储器【综合】2015年08月28日第11周-继承与派生-项目3-职员有薪水啦(二) 【编程语言】2015年05月20日【Mysql】求出离最近相差X天的项,sql语句关于日期的比对 【互联网】2015年04月24日final,finally,finalize区别【移动开发】2015年08月17日根据经纬度返回地址的url--GoogleMap 【编程语言】2014年11月11日如何求两数的最大公约数 【编程语言】2015年06月24日显示随来访次数信息2014年01月28日cocos2d-x3.5版运行test工程 【编程语言】2015年05月07日nyoj摆方格 【架构设计】2015年04月13日留几手:互联网创业到底是咋回事(说得真经典,创业者不创业的都值得一看) 【综合】2015年08月24日Android中如何使用Intent传递对象 【互联网】2015年08月17日修改一行代码,解决在C++Builder平台上JSONCPP向数组添加元素的Bug 【综合】2015年04月27日XBRL使用入门-2 【移动开发】2015年01月27日进程切换(进程上下文和中断上下文)详解【编程语言】2014年12月12日IT忍者神龟之Oracle查询树形结构【研发管理】2014年11月10日对hibernate增删改查总结【编程语言】2014年11月06日MySQL管理工具phpMyAdmin3.4.7正式版发布下载 ,,2016年06月29日【leetcode】139WordBreak 【编程语言】2015年09月15日leetcode204187205CountPrimesRepeatedDNASequencesIsomorphicStrings 【综合】2015年05月11日如何在Access2003和Access2002中创建DSN的连接到SQLServer对链接表2014年01月29日monkeyrunner——控件交互总结整理 【综合】2015年02月27日关于中gridview字符串截取的方法2014年01月29日ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)2014年01月29日浅谈技术组件客户端的并发问题 【架构设计】2015年03月10日iOS十六进制配置背景颜色【互联网】2015年04月17日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)