基于Abp React前端的项目建立与运行——React框架分析
基于Abp React前端的项目建立与运行
1 Abp项目配置

2 运行WebApi后端项目
2.1 创建C3D数据库,并且将数据库对应链接字符串替换

2.2 建立数据库进行数据迁移
主项目选择到StartUp所在的项目,C3D.Web.Host,nuget console窗口打到C3D.EntityFrameWork.Core项目;

然后输入数据迁移指令
Add-Migration first_init
Update-Database
2.3 运行WebApi项目
选择C3D.Web.Host,点击运行。
Swagger WebApi 接口页面如下:

3 运行React前端项目
3.1 利用yarn包安装工具
利用yarn包安装工具安装react客户端运行所需依赖包。

备注:会发现用npm无法安装成功,用yarn包安装时需要删除package-lock.json文件。
3.2 运行React项目
npm start
登录页面

登录用户名:admin
密码:123qwedashboard

3.3 使用React客户端的意义
有没有感觉3.2的UI很好看,是的,个人感觉UI的精细程度已经远远超过VUE的Element 跟Iview UI了。因为该项目使用的是ant-design UI。
而 github上直接搜索UI,按start排名。前两个UI 的都是react。这也就是我选择react的意义了。使用哪个框架其实都差不多,个人比较看重UI展示的精细化程度与美感。



这两个UI框架的贡献者与使用者规模已很大。
4 React 前端项目架构
4.1 技术栈
- React 构建用户UI的js库;
- Typescript 强类型语言,更适合后台编程人员;
- Mobx 简单,可扩展的状态管理框架;
- AntDesign 可为企业应用程序提供更好的用户体验;
4.2 设计原则
SOLID
| 简写 | 全拼 | 中文翻译 |
|---|---|---|
| SRP | The Single Responsibility Principle | 单一责任原则 |
| OCP | The Open Closed Principle | 开放封闭原则 |
| LSP | The Liskov Substitution Principle | 里氏替换原则 |
| ISP | The Interface Segregation Principle | 接口分离原则 |
| DIP | The Dependency Inversion Principle | 依赖倒置原则 |
单一责任原则:
当需要修改某个类的时候原因有且只有一个(THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO CHANGE)。换句话说就是让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。开放封闭原则:
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。里氏替换原则:
当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。接口分离原则:
不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口总要好。依赖倒置原则:
1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象
2.抽象不应该依赖于细节,细节应该依赖于抽象
4.3 mobx架构
官方例子
import React from "react"
import ReactDOM from "react-dom"
import { makeAutoObservable } from "mobx"
import { observer } from "mobx-react"
// Model the application state.
class Timer {
secondsPassed = 0
constructor() {
makeAutoObservable(this)
}
increase() {
this.secondsPassed += 1
}
reset() {
this.secondsPassed = 0
}
}
const myTimer = new Timer()
// Build a "user interface" that uses the observable state.
const TimerView = observer(({ timer }) => (
<button onClick={() => timer.reset()}>Seconds passed: {timer.secondsPassed}</button>
))
ReactDOM.render(<TimerView timer={myTimer} />, document.body)
// Update the 'Seconds passed: X' text every second.
setInterval(() => {
myTimer.increase()
}, 1000)
每个UI 组件(TimerView)都可定义一个observer 观察者,无需强制绑定,一旦该组件值发生变化,则会对UI进行自动计算渲染。也即如下流程图,一旦值变化事件发生,则会更新observer的状态,进而计算,进而出发UI重新渲染,而定义好,这些都通过mobx自动完成。

4.4 React前端整体架构

- 所有与后端通信都通过服务层完成;
- 每个容器里的组件都会存在一个仓储与一个模型;
- 所有的服务在仓储层被调用,而非组件层;组件会执行仓储的actions来获取最新状态;
- 展示组件的属性可以直接存储到仓储中,也能直接去仓储中取出;
- 容器或者展示组件可以调用仓储的actions,Mobx能直接将注册过的组件进行自动渲染。
5 小结
这里为什么要用仓储层呢,笔者根据自己理解解释下,
- 如果没加仓储,所有获取后台数据的服务都会泄漏到组件容器中,那样万一哪天需要改服务,则要到各组件中去改,会让人抓狂,而该框架中只需要在仓储层中改即可;
- 另外有了仓储层,比如vue的vuex与react的redux或者mobx,可以在仓储层中作区分,而业务层代码完全可以写成一样,这样更易于vue与react之间的移植;
这应该是属于依赖倒置原则,组件调用依赖于仓储这个抽象并没有依赖于获取数据的对应服务,从而实现了易扩展,易复用,易维护的目的。
版权声明:本文为博主翻译文章+自己理解,部分代码自己写,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.cnblogs.com/JerryMouseLi/p/14336688.html
基于Abp React前端的项目建立与运行——React框架分析的更多相关文章
- 「实践篇」解决微前端 single-spa 项目中 Vue 和 React 路由跳转问题
前言 本文介绍的是在做微前端 single-spa 项目过程中,遇到的 Vue 子应用和 React 子应用互相跳转路由时遇到的问题. 项目情况:single-spa 项目,基座用的是 React,目 ...
- React前端有钱途吗?《React+Redux前端开发实战》学起来
再不学React就真的跟不上大前端的形式了,目前几乎所有前端的招聘条件都是精通React者优先,看看拉勾网的React薪资,都是15K-20K,这个暑假,必须动起来了. 如果你熟悉JavaScript ...
- React Native新项目启动报错'React/RCTBridgeDelegate.h' file not found
React Native版本:0.60.4 解决方法: cd ios pod deintegrate pod install 然后重新启动就好了(示例页面变样了( ⊙ o ⊙ )) END------ ...
- 基于“事件”驱动的领域驱动设计(DDD)框架分析
摘抄自 从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven ...
- 基于ABP模块组件与依赖注入组件的项目插件开发
注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...
- React躬行记(16)——React源码分析
React可大致分为三部分:Core.Reconciler和Renderer,在阅读源码之前,首先需要搭建测试环境,为了方便起见,本文直接采用了网友搭建好的环境,React版本是16.8.6,与最新版 ...
- 在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理
Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js ...
- 在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理
在前面随笔介绍了<在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理>的处理,有的时候,我们在流程中或者一些文件签署的时候,需要签上自己的大名,一 ...
- 在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理
在一些内部OA或者流转的文件,或者给一些客户的报价文件.合同,或者一些医院出示的给保险机构的病历资料等,有时候可能都希望快速的使用电子签章的处理方式来给文件盖上特定的印章,本篇随笔介绍基于Vue&am ...
随机推荐
- 《Spring Boot 实战纪实》之关键点文档
目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...
- Docker跑项目中常见的中间件
声明: 本章只作为记录 前端时间跑项目,发现每次都需要启动大量的中间件.在Windows 上启动特别麻烦 就想着写篇文章总结一下,把所有的 中间件全放服务器上启动 ,下次 直接复制黏贴命令就好了. 例 ...
- Spring Boot GraphQL 实战 01_快速入门
hello,大家好,我是小黑,又和大家见面啦~ 新开一个专题是关于 GraphQL 的相关内容,主要是通过 Spring Boot 来快速开发 GraphQL 应用,希望对刚接触 GraphQL 的同 ...
- C# 队列Queue,ConcurrentQueue,BlockingCollection 并发控制lock,Monitor,信号量Semaphore
什么是队列? 队列Queues,是一种遵循先进先出的原则的集合,在.netCore中微软给我们提供了很多个类,就目前本人所知的有三种,分别是标题提到的:Queue.ConcurrentQueue.Bl ...
- 在GitHub里面如何删除库
GitHub是一个面向开源及私有软件项目的托管平台,今天将为大家介绍如何在GitHub中彻底删除一个代码仓库. 在GitHub里面如何删除库 1.先进入个人仓库里面 2.点击进入你想要的删除的库 3. ...
- 【Objective-C】1.oc点语法
在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法".比如: 1.在Student类的第2行定义了一个公共的成员变量a ...
- 你好,Spring!
交个朋友 拿人钱财替人干活儿,在不影响工作的前提下,想做到很高频率的更新很难,但是我也尽力输出,不能为了写而写,宁缺毋滥吧. 我的想法是这样的,接下来的一段时间专门写Spring框架.整体思路就是:入 ...
- 面试常问:Mybatis使用了哪些设计模式?
前言 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybati ...
- 关于opcache中opcache.revalidate_freq参数设置测试报告
1.测试目的: 测试出opcache中,opcache.revalidate_freq这个参数最适合的大小 说明:如果opcache.revalidate_freq参数越大,服务器单位时间能接收的请求 ...
- js--数组的every()和some()方法检测数组是否满足条件的使用介绍
前言 阅读本文之前先来思考一个问题,如何如实现判断一个数组中是否存在满足条件的元素,如何去判断数组中是否全部元素都满足判断条件,这里可能能想到使用for循环遍历数组,if()判断每一项是否符合条件,同 ...