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,一经查实,立即删除!

相关文章

【算法】LeetCode算法题-Maximum Subarray

这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53)。给定一个整数数组nums,找出一个最大和,此和是由数组中索引连续的元素组成,至少包含一个…

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及验证…

java起源英文_Abbreviation 英文词组缩写(来源:南阳理工大学ACM)java

As we know, we often use a short sequence of characters in place of some words with a very long name. For example, ACM is an abbreviation of “Association for Computing Machinery”. Now we are using an acronymic method to get the abbreviation. An acronym i…

【C# Personal Handbook】运行环境

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

如何完善自己的知识结构

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

MATLAB编程与应用系列-关于MATLAB编程入门教程的总体编写安排

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968qq.com。 出版社:人民邮电出版社, 页数:525。 本系列教程目前基于MATLABR2006a,可能对于更高级…

python语言特性-------python2.7教程学习【廖雪峰版】(一)

开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活。 2.Python是一种相当高级的语言。代码少还不好?代码少的代价是运行速度慢。3.用Python可以做什么…

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的配置,最后…

jQuery 基金会和 Dojo 基金会合并:Open Web

统一基金会,服务开发人员,推动开放 Web 技术发展jQuery 基金会和 Dojo 基金会今天宣布计划联合,旨在建立最大,最多样化和最全面的基金会,通过服务开发者,他们的项目,他们的社区来构建开放的 Web…

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

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

jQuery.extend()方法

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

1066. 图像过滤(15)

原题: https://www.patest.cn/contests/pat-b-practise/1066 思路: 开胃小菜 实现: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 题…

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

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

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

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

go 返回mysql数组_Go基础之--操作Mysql(一)

关于标准库database/sqldatabase/sql是golang的标准库之一&#xff0c;它提供了一系列接口方法&#xff0c;用于访问关系数据库。它并不会提供数据库特有的方法&#xff0c;那些特有的方法交给数据库驱动去实现。database/sql库提供了一些type。这些类型对掌握它的用法非常重要…

Vue CLI 3开发中屏蔽烦人的EsLint错误

问题 Vue开发中&#xff0c;特别是当你阅读分析别人的其中早期版本的Vue代码时往往会遭遇到满屏幕的烦人的EsLint错误。有关EsLint这个工具的作用不再赘述。查阅网上参考文档&#xff0c;大多是针对早起版本Vue CLI工具项目的&#xff0c;在我最新使用的Vue CLI 3生成的工程中根…

pyinstaller---将py文件打包成exe

pyinstaller可将Python脚本打包成可执行程序&#xff0c;使在没有Python环境的机器上运行。 1.pyinstaller在windows下的安装 直接在命令行用pip安装 pyinstaller&#xff0c; 在windows下&#xff0c;pyinstaller需要PyWin32的支持。当用pip安装pyinstaller时未找到PyWin32&am…

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

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