React+Redux仿Web追书神器

引言

由于 10 月份做的 React Native 项目没有使用到 Redux 等库,写了一段时间想深入学习 React,有个想法想做个 demo 练手下,那时候其实还没想好要做哪一个类型的,也看了些动漫的,小说阅读,聚合资源的开源项目。由于正好在学习开源的 Android 小说阅读器 -- 任阅,开始边学边做,已完成的功能列在下面。项目地址 在这里,如果有好的意见欢迎提 issue或pr。

效果图

160592c0a575964a?w=1893&h=871&f=gif&s=9585858

目标功能

  • [x] 排行榜 -- 完成
  • [x] 书籍详情 -- 完成
  • [x] 阅读书籍 -- 完成
  • [x] 书单推荐 -- 完成
  • [x] 搜索书籍 -- 完成
  • [x] 精选书籍 -- 完成
  • [x] 分类书籍 -- 完成
  • [x] 主题书单 -- 完成
  • [x] 书单详情 -- 完成
  • [x] 主 页 -- 完成

目录结构

.
├─actions                              #redux的action,业务逻辑
├─components                           #页面容器
│  └─common                            #公共目录
│      ├─component-module              #封装的组件
│      ├─images                        #项目图片
│      │  └─icon
│      └─style                          #组件样式
├─modules                               #公用模块
│  ├─api                                #管理api请求类
│  └─constants                          #公共字段类
├─reducers                              #redux中的reducers,处理action发送的数据流
├─router                                #路由管理模块
├─store                                 #redux中的store,联结reducers
└─template                              #存放html模版
.

项目的初始结构和说明已罗列如上。

下面对目录结构作以下说明

  • 项目最初始是参考 react-pxq 初始化的。

  • 中间件引人日志中间件 —— redux-logger,异步 API 调用 —— redux-thunk 等;

  • component-module 和 components 存放的都是 react 组件,区别是:容器组件就放在components中,和模块组件(比如左侧菜单组件、书籍列表组件等)就放到 component-module中;

  • 页面状态等公共部分最好是独立起来,统一管理;

  • 跨域配置使用 pathRewrite 字段,需要注意 webpack-dev-server 的版本

准备工作

    1. 整理 API
    1. 学习 Redux(搭建脚手架)

API 数据

  • 数据来源主要是两个地方:一个是开源的Android项目与RN版本的数据,另一个是追书神器h5移动端
  • 数据跨域:网上查了不少方法,考虑到便捷,使用反向代理的方式处理

学习 Redux

  • 刚开始我差不多用一个星期多学习了 Github 上的 从零开始学 ReactJS(ReactJS 101),基本上每一天看个 1-2 章,玩的也很开心,浅显易懂,适合初学者阅读。

    前面 8 章:主要是熟悉接下来会用到的基础概念,当然每一章讲完理论,后面都会有例子自己可以动手实践,加深对于前面概念的理解。

后面 9、10 两章开始运用上面学到的内容,做一个简单的项目。

  • 接着是用了 5-6 天学习网上开源项目的脚手架 —— 一个 react + redux 的完整项目 和 个人总结,基本上是看

参考所使用的库、编译打包的脚本以及 redux 代码。

  • 最后,大概花了 3 天看了阮一峰老师写的 Redux 入门教程

这部分内容是后面在搭建项目整体结构的时候看的,对于 reducers、action、store 的内容比较深入,加深理解。

技术栈

  • 虽然列了众多核心库,但是自己也谈不上熟练运用,所以列了一些遇到的问题和后期改进的东西。

Webpack(3.10.0)

  • 本项目主要用了第三方的脚手架,学习了反向代理部分,当然自己也搭建过 webpack,后续会升级 webpack。

  • 这里提下反向代理部分,关于使用 webpack-dev-server 进行配置反向代理的时候,如果使用 pathRewrite 到属性需要注意 webpack-dev-server 版本,这个属性是在 1.15.0 中,不然是不起作用的。特此说明,网上查到相同问题没有这个解释,以免浪费时间。

  • 升级Webpack到3.10版本并更新其他老的包,比如file-loader,css-loader等,出现的问题在下发表格中。

Webpack1.x升级到Webpack3.10
问题1.x3.10备注参考
webpack 2 cannot resolve empty extensionsextensions数组中不能出现空字符或者字符串resolve: {extensions: ['','.css']}resolve: {extensions: ['.css']}参考1
Error: Chunk.entry was removed. Use hasRuntime()"extract-text-webpack-plugin": "^1.10.0","extract-text-webpack-plugin": "^2.1.2",版本问题参考1
Error: Breaking change: extract now only takes a single argument. Either an options object *or* the loader(s).loader: ExtractTextPlugin.extract('style', ['css', 'autoprefixer']),ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })新的版本只支持一个参数npm run dev 命令运行结果错误提示
找不到API SchemamodulesDirectoriesmodules属性名称变更npm run dist 命令运行结果错误提示
找不到OccurenceOrderPluginnew webpack.optimize.OccurenceOrderPlugin(),newwebpack.HotModuleReplacementPlugin(),new webpack.NoErrorsPlugin(),new webpack.optimize.UglifyJsPlugin()new webpack.HotModuleReplacementPlugin(),new webpack.optimize.UglifyJsPlugin()移除了OccurenceOrderPlugin 和 NoErrorsPlugin参考1

Redux

  • 简单的讲他是一个管理单向数据流的框架,根据业务复杂度可以把控其中颗粒度。一开始学习的时候感觉反而把项目复杂化,看原理也是半懂不懂,后面不断实践理解前面看的内容,总归理论要与实践结合起来。
    模型如下:简单的数据流向可以看作 View -> Action -> (Middleware) -> Reducer
    160592c0a21a5f2a?w=1501&h=1197&f=png&s=102313

React-router(2.x)

react-router(2.x)与react-router(4.x)的还是不同的,当然主要是写法上,所以没更新到4.0

另外, 发布打包时使用nginx等应用服务器托管的时候需要配置下,所用路由走index.html文件,不然路由会被拦截。

Antd(2.13)

  • antd是(蚂蚁金服体验技术部)经过大量的项目实践和总结,沉淀出的一个中台设计语言 Ant Design,使用者包括蚂蚁金服、阿里巴巴、口碑、美团、滴滴等一系列知名公司,其中包括了移动端,Web端,Pro(最近刚出)

  • 遇到错误可以翻看 Antd的issues,基本能解决。

  • 提 Issues 的话要符合一定规范,一开始感觉麻烦,后来看了 提问的智慧,恍然大悟这部分的必要性。

扩展内容

功能扩展

  • 讨论区数据统计分析,主要想知道一段时间的热点内容。

测试及优化

  • 现在项目代码是没有进行单元测试,后续学习集成JEST测试
  • 优化部分页面的组件以及一些 bugs

转载于:https://www.cnblogs.com/lmf-techniques/p/7852525.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows配置solr5.5.2(不通过tomcat,使用内置jetty)

一、windows下配置solr5.5.2(不通过tomcat,使用内置jetty) 第一步:安装Jdk1.7 Solr5.5好像只支持Jdk1.7及以上的版本,没亲测,solr6.0是只支持jdk1.8及以上的,下图为启动solr时的截图: 如何在windows环境下配置jdk及验证…

【C# Personal Handbook】运行环境

一、CLR、CLI、CTS、CLS、BCL、FCL简介CLI(公共语言基础)CLI是微软公司向ECMA提交的一份语言和数据格式规范,CLR是目前为止唯一一个公共语言基础的实现版本。CLI包括了公共类型系统(CTS)、公共中间语言(CIL…

如何完善自己的知识结构

★领域 (本来想用“学科”这个词,后来觉得“学科”的范畴还是偏小,就改用“领域”)  按照传统的习惯,通常会把知识归类到不同的领域(比如:文学、数学、计算机、烹调、等等)。 ◇领…

java调c++代码_Java中调用C++代码的实现 | 学步园

JNI为 Java Native Interface 即Java本地接口,使用此种方式可以对C/C代码进行调用,其在本质上是对C/C生成的动态库进行调用而不是直接对C/C代码进行调用Java代码如下:public class TestJNI{//JNI在本质上是调用C/C的动态库来实现的&#xff…

jeesite1.X 集成多数据源

2019独角兽企业重金招聘Python工程师标准>>> 网上看了几个例子,都是相同数据源的动态切换,如果不是同一种数据库类型,分页查询就出问题。经过研究解决问题。 jeesite.properties配置多数数据源地址,这里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自动水平伸缩

Horizontal Pod Autoscaling in Kubernetes写在前面我们平时部署web服务,当服务压力大撑不住的时候,我们会加机器(加钱);一般没有上容器编排是手动加的,临时加的机器,临时部署的服务还要改Nginx的配置,最后…

spark java 逻辑回归_逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件

原标题:逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件由于最近的工作原因,小鸟很久没给大家分享技术了。今天小鸟就给大家介绍一种比较火的机器学习算法,逻辑回归分类算法。回归是一种监督式学习的方式,与分类类似…

jQuery.extend()方法

定义和用法jQuery.extend()函数用于将一个或多个对象的内容合并到目标对象。 注意: 1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略。此时,target就是jQuery对象本身。通过这种方式,我们可以为全局对象jQuery添加…

Wget用法、参数解释的比较好的一个文章

一个语句就可以下载cvpr2016的全部论文: wget -c -N --no-clobber --convert-links --random-wait -r -p -E -e robotsoff -U mozilla http://www.cv-foundation.org/openaccess/CVPR2016.py 其中,-c表示断点续传;-N表示已经下载的内容不再重…

.NET VS智能提示汉化 (.Net6)

先上现成的.net6汉化文件,可以手动下载后参照 [如何为 .NET 安装本地化的 IntelliSense 文件 ](https://learn.microsoft.com/zh-cn/dotnet/core/install/localized-intellisense)进行安装。或者使用后文的工具进行自动安装。无对照英文在前中文在前汉化内容来自 官…

老人寻求到一名程序员,用2W行代码给自己打造了一幅肖像画

今天翻墙看了下国外的论坛,看到了一位版主给一位老人描绘肖像画的文章,不得不说这位大佬是真的厉害,近20000行代码,而且还画的很像,像小编我这种手残党,用笔也不能画出来,不得不服,今…

一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]

[接上篇]“天下大势,分久必合,合久必分”,ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系统中之后,也许微软还是意识到Web应用和后台服务的承载方式还是应该加以区分,于…

GitHub服务中断24小时11分钟事故分析报告\n

上周,GitHub经历了一次事故,导致服务降级24小时11分钟。虽然平台的某些部分不受事故影响,但仍然有多个内部系统受到了影响,向用户显示了过时且不一致的内容。所幸没有用户数据丢失,但针对几秒钟数据库写入的手动调整工…

php 合并 字符串_PHP如何去重合并字符串

本篇文章主要给大家介绍PHP如何去重合并字符串。推荐教程:《PHP教程》对于PHP学习者来说,合并多个字符串,应该并不是很难。但是如果这多个字符串中,有相同元素,当我们想要合并他们并且要使其值具有唯一值。也就是说合并…

软概(lesson 2):课堂测试

一、测试题目 二、完成过程 1.设计思想 ①连接mysql数据库 ②设计user类,增加参数 ③设计add类,向数据库内增加内容 ④设计addInput页面,完成录入操作 ⑤设计add页面,接收录入的参数,并调用add类函数 2.源代码 user.ja…

谷歌Gboard输入法新增“无痕模式”:仅在Chrome隐身窗口中适用

据外媒Android Police报道,如大家所知道的,Chrome浏览器中的“隐身模式”是为了防止你的私密浏览记录被其他人看到,但是,在这种模式下,你的输入法键盘依然会记住你输入的短语,为了阻止你的键盘在Chrome隐身…

php两个数组融合,php合并两个数组的方式有哪些

1、arrary_merge示例代码:$arr1 array(1, 2, 3, 4, 5);$arr2 array(1, 2, 6, 7, 8, 9, 10);$result1 array_merge($arr1, $arr2);$arr3 array("name" > "itbsl", "age" > 13, "sex" > "Male");$arr…

最近对latin-1这个字符集产生了不少好感

【简介】 最近我要解析一个数据库中间件的日志、这个中间件会在日志中记录SQL发往的后台DB ,执行耗时,对应的SQL;中间件直接把SQL写到 了日志中去,并没有对SQL进行适当的编码转换;理想情况下这个也不会有什么问题,不幸…

面象对象设计原则之六:迪米特原则(LeastKnowledge Principle, LKP)

迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。迪米特法则又称为最少知识原则(LeastKnowledge Principle, LKP),其定义如下: 迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与…

其他对象的表单

1.textarea&#xff1a; textarea对象就想是input对象中的text样式的表单&#xff0c;只不过是扩展过的text样式表单。它可以通过行&#xff08;rows&#xff09;属性和列&#xff08;cols&#xff09;属性来编辑文本域的大小。最常见于留言板、论坛时回帖时的文本框等。 <h…