在这里,我们将给大家分享关于谈谈dva和mobx的使用感受的知识,让您更了解dva和mobx区别的本质,同时也会涉及到如何更有效地AgGrid框架的使用感受及前景分析、beetl的使用感受、Charl
在这里,我们将给大家分享关于谈谈 dva 和 mobx 的使用感受的知识,让您更了解dva和mobx区别的本质,同时也会涉及到如何更有效地AgGrid 框架的使用感受及前景分析、beetl 的使用感受、Charles的使用感受、Deepin的使用感受的内容。
本文目录一览:谈谈 dva 和 mobx 的使用感受(dva和mobx区别)
在使用 react
的时候或多或少会接触到状态管理,从开始学 react 到现在也挺久了,也用过几种状态管理工具,今天谈一谈这些工具的区别吧。
dva
经朋友推荐开始接触 dva
,从 1.x 版本开始使用,一直看着它发展到前不久的 2.x,我也基于这个工具开发了一套项目模版,它简化了 redux
的使用,并且在封装了 redux-saga 和 react-router,同时还可以包含 dva-loading 插件获取 loading 状态等。
在 redux 时代,当我需要新增一种跨页面全局数据的时候,我需要去项目的 reducers 目录定义一下这种数据命名和初始值,然后在 constans 目录中为更改这项数据的操作定义一种唯一的操作类型(type),再去 actions 目录定义一些方法,这些方法最后会得到更改后的数据和操作类型(type),最后再回到 reducers 中根据这个操作类型(type)把数据整合到 reducer 中…可以看到,我在编写 redux 这部分代码的时候需要频繁在 actions 、 constants 、 reducers 这几个目录间切换。
而使用 dva 就可以免除这些困扰了,我只需要一个 model 中就可以完成所有操作:
// app全局性状态管理 import * as appApis from '../services/app'; // 异步请求接口 export default { namespace: 'app',state: { channels: [],show: true },reducers: { getChannelsAndGamesSuccess(state,{ channels,games }) { return { ...state,channels,games }; },changeShow(state,{ show }) { return { ...state,show }; } },effects: { // 异步 * getChannelsAndGames(_,{ call,put }) { const res = yield call(appApis.getChannelsAndGames); yield put({ type: 'getChannelsAndGamesSuccess',channels: res.channels }); } },subscriptions: { // 订阅 setup({dispatch,history}) { history.listen(location => { if (location.pathname == '/') { dispatch({ type: 'getChannelsAndGames' }); } }); } } };
这便是一个 model 对象,state 定义数据、effects 中执行异步请求、触发 action 在 reducers 中改变数据,一气呵成!
此外它还含有其他特性,比如:subscription(订阅),可以在这里订阅 history 路由变化,进入根路径执行 getChannelsAndGames
获取数据,而不需要在 react 的生命周期中做这些事;用上 dva-loading 插件,在更改数据的过程中还会自动设置 loading 状态,这在异步请求中非常有用!
mobx
既然 dva 这么好用,为什么还要使用 mobx 呢?还不是为了折腾?,用了才能知道两者的优劣,同样的基于 mobx 我也创建了一个项目模版。
在使用 dva 的时候,但凡遇到异步请求的时候都需要先定义一个 effects ,请求完成后再触发一个 action 去修改数据,于是,强迫症作怪,这两者的命名总是让我感觉难受和啰嗦,你可以看到我都是定义为 getXxx
和 getXxxSuccess
。
action 是修改 state 的唯一途径,是的,所有的状态管理库都是这样的,但是 mobx 通过一些工具函数解决了这一问题:
// app全局性状态管理 import { observable,action,runInAction } from 'mobx'; import * as appApis from '../services/app'; export default class AppStore { @observable show = true; @observable list = []; @action toggleShow = () => { this.show = !this.show; } @action getData = async (params) => { try { const res = await appApis.getTopicslist(params); // await 之后,再次修改状态需要动作: runInAction(() => { this.list = res.data; }); } catch (e) { console.error(e); } } } /** * ----------------------------------------------------------------- */ // app全局性状态管理 import { observable,action } from 'mobx'; import { asyncAction } from "mobx-utils" import * as appApis from '../services/app'; export default class AppStore { @observable show = true; @observable list = []; @action toggleShow = () => { this.show = !this.show; } @asyncAction * getData(params) { // <- 注意*号,这是一个 generator 函数! try { const res = yield appApis.getTopicslist(params); // 用 yield 代替 await this.list = res.data; } catch (e) { console.error(e); } } }
以上是我最喜欢的两种写法,分别借助了 runInAction
和 asyncAction
这两个工具函数,当然,还有其他方法可以参考。
总结
不管是 redux 、 dva ,还是 mobx ,每种技术的出现都是为了带给我们更好的开发体验、更高的开发效率,也伴随着不一样的学习成本,虽然 mobx 可以治好我的强迫症,但是也反逼我去学习了修饰器;虽然看起来 redux 是最繁琐的,但是它可能是对新手最友好的,参考资料也是最多的,也能够一步步让我知道状态是如何改变的,再者,如果我没使用过 redux ,未必能体会到后两者带给我怎样的便利之处。
AgGrid 框架的使用感受及前景分析
免责声明:文章源于本人闲情雅致,没有任何广告意图
我向来是不屑于使用前端框架的,最多用一些 ui 组件,但是 ag-grid 这个框架太 TM 好用了。这篇文章介绍下 aggrid 的一些哲学思想和我的使用感受,顺带记录一些往事。
CompetenceX:我开发的第一个网站
大三在博世西门子实习期间,我为公司开发了人生中第一个像模像样的 H5 网站:CompetenceX(能力矩阵管理系统,以下简称能力矩阵或 C9X)。网站本身没有太多技术含量,基于 aggrid 和 mongodb 外加一个简单的数学模型,但是却成为我在 web 开发领域中的启蒙项目,为我之后的求职道路上提供了不少燃料。
能力矩阵是一个用来评估员工竞争力和职业技能的一个平台,和所有需求方一样,我的老板当时就给出了这个很模糊的需求。这时一个成熟的开发者当然应该用自己的技术来引导甚至改变用户的需求,但无论如何,首先要做的是建立一个基本的数据对象模型,比如 ER 图。
我当时为了应对未来可能的需求变更,设计了一套更加通用的对称关系模型,希望能在以后的日子中为我节省些许时间,为此我还专门买了本《MongoDB 应用设计模式》来研究 mongodb 中集合与关系的关系。。(多年之后我才明白,几个月的实习期没必要考虑这么长远,按要求撸码、划水、交货才最实在。。)能力矩阵的 ER 图如下:
图中只有 2 个实体:person 和 project,剩下 2 个虚拟实体分别是 person 和 project 的父类。最重要的关系就是 2 个主要实体之间的 work,work 关系还拥有属性:2 个实体之间存在多对多的关系,所以需要另外一个数据表来存放。mongodb compass 截图如下,其中 human 和 skill 就是 2 个实体集合,unit 则是 work 关系集合。
但是我今天可不是来介绍能力矩阵这个项目的,而是为 aggrid 做铺垫。据我所知,前公司现在依然在用我的 C9X,经过 4 个大版本,无数个小版本迭代之后的 C9X 之所以成熟稳定完全是依靠它背后强大的驱动引擎 Ag-Grid 而生存的。
Ag-Grid:媲美 Excel 的 web 框架
完美的集合关系模型如何在前端展现呢,最好的办法呢就是画一个表格,经过 1 个多月的框架抉择,我终于在能力矩阵 2.X 版本中选择用 aggrid 来重构整个系统。(当时我在外网上海淘一款用 JavaScript 来实现 Excel 功能的表格框架,在一个不愿意透露姓名的热心群众的推荐下,我来到首页上大言不惭地写着 “The Best JavaScript Grid in the World” 的 aggrid 官网,但后来打脸发现人家真的是同行业口碑最高的框架没有之一)
aggrid 的版本号已经高达 22.X,在其众多功能与特性中最强大也是最闪耀的一个就是它今年刚刚发布的统计图功能。注意,统计图是 aggrid 今年才推出的,也是今年 aggrid 刚成为第一个能够同时兼并表格和图表的重量级框架,而且图表颜值不输 echarts 和 chart.js 等框架。在以前常常需要将表格框架和图表框架结合使用才能满足某些大数据系统,但如今 aggrid 已经独自承担 2 个重量级应用模块,这是我认为很酷的地方。
统一的图表语言
无论是表格还是各种统计图在数据上都是统一的,都是二维列表(也可以叫列表的列表),一个表格可以无损地转化成一个柱状图,折线图,雷达图,饼图。。。所以表格可以看成是一种特殊的图表。著名的前端框架 ag-grid 就是在这个理论上诞生的。
简而言之,表格即图表,图表即表格,它们在数据上是一致的,只是表现形式不同而已。可是市面上的应用框架要么就是纯表格的,要么就是纯图表的,直到我遇见了能将二者结合起来的 aggrid。
虚拟 DOM
AgGrid 也融入了虚拟 DOM 来提升 UI 性能。DOM 是一种很垃圾的技术,这是世人皆知的,但由于一些兼容性缘由,DOM 一直没有被优化。
例如,使用 “table”,“ tr” 和 “ td” 标签时,将 1000 条带有 20 列的记录加载到浏览器中,则该页面最终将带有许多呈现的 DOM 元素。这将大大降低网页速度。这将导致非常差的用户体验,或者由于浏览器内存不足而导致浏览器崩溃。
为了解决这个问题,aggrid 仅呈现能在屏幕上看到的内容。例如,如果您将 1,000 条记录和 20 列加载到网格中,但用户只能看到 50 条记录和 10 列(因为其余的未滚动到视图中),则网格仅呈现用户的 50 行和 10 列可以实际看到。
简而言之,DOM 虚拟化的实现之一就是,DOM 元素的数量等于当前屏幕上可见元素的数量,而不是整个页面上元素数量。
AgGrid 影响力
AgGrid 中的 Ag 取自 “Agnostic”,直译过来是 " 不可知论者 ",虽然我也不明白啥意思,但官方的解释是:aggrid 零依赖,零依赖的框架就叫” 不可知论框架 “((lll¬ω¬))。
除此之外,AgGrid 还是 webpack 的 2 个白金赞助商之一。webpack 作为一个开源项目,生存基本靠水滴筹,哦呸,是靠爱心捐款。webpack 的数百家企业赞助商按照捐款数量从小到大分为青铜会员,白银会员,黄金会员,白金会员,不知道出于什么目的,AgGrid 承诺每个月捐赠 $2,500 给 webpack,是仅次于 trivago 的白金会员。
AgGrid 并不是一家开源公司,但是 JavaScript 框架所谓的 “不开源” 也就是弄一个版权警告而已,其收费的 enterprise 版本也可以直接扒拉下来使用,真不知道他哪来这么多钱去补助 webpack 的。
组件化与模块化
组件和模块在广义上是同一个概念,在狭义上是不同的概念。
通常组件和模块指的是同一个概念,都是一种 “分离”,“隔离” 的设计模式。只是组件是前端的概念,模块是后端的概念,所以组件一般指的是前端 UI 组件,模块一般指后端的功能模块。但如果把组件和模块都拿到前端来借一步说话,他俩就有鲜明的区别了,是否一定有区别还得看 UI 与功能是否完全分离,当然这就扯远了。
作为前端设计的趋势,AgGrid 早在 2017 年就开始使用 WebComponents,但由于整个 aggrid 就是一个 UI 元素,组件化的效果和反响并不显著;但 AgGrid 从 22.X 版本(2019)开始引入模块化的概念,这样用户就可以按需加载功能模块,使得框架体积可以大大减小(enterprise 完整版 2m+)
看来拆分的思想无处不在,enterprise 完整本可以拆成如上图所示的若干个模块。哦,对了,AgGrid 还有一个 “免费” 的 community 版本不建议使用,因为正真有价值的功能模块包括图表,侧边栏,行列过滤器,搜索引擎,Excel 导入导出,右键菜单,索引等核心功能全都在 enterprise 版本里,留给 community 版本的只有寥寥几个毫无竞争力的基础表格功能(如下图),你用 community 版本还不如使用其他开源表格框架。
所以 AgGrid 的正确用法是把 enterprise 的所有模块(包含 community 的所有模块)从官网或 GitHub 扒拉下来,然后将自己需要的那些组装进应用(教程见官网)。但生成的应用仅供我们内部交流和使用,不可再次销售,否则就违背了 AgGrid 的版权协议。
AgGrid 设计模式
这个话题本身应该单独拉出一篇博客来谈,但篇幅有限就随便聊聊。在使用 AgGrid 的时候不要把它看成一个表格,把它想象成一个关系型数据库,用关系代数的思想来操作它,就会发现,无论是表格还是统计图都是一样的逻辑。
设计 focus 对象
focus 对象是我常用的一种自定义对象,通常挂载在 window.app 上,但在 aggrid 这个重量级框架面前,也可以挂载在 <ag-grid></ag-grid > 元素上面。focus 的思想来自经典的操作习惯:先选中对象再操作对象。在我的 C9X 项目中 focus 的属性包括当前聚焦的对象:人,人的分类,技能,技能的分类,人与技能的关系(unit),聚焦的行,聚焦的列。当鼠标在某一个单元格右击的时候就会自动的刷新 focus 对象,在右键菜单中就能对当前对象做相应的操作。这就是聚焦的哲学。
(未完待续)
参考资料
https://jimmy.blog.csdn.net/article/details/89436682
https://cloud.tencent.com/developer/article/1372443
https://jimmy.blog.csdn.net/article/details/103249146
https://cloud.tencent.com/developer/article/1547110
本文分享自微信公众号 - WebHub(myWebHub)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
beetl 的使用感受
beetl 的用法,跟 layui 的 laytpl 的模版语言差不多。写的很舒服。没有 thymeleaf 那么麻烦。例如
<%
for(loadDischargItem in loadDischargItemList){
%>
<tr>
<td>${loadDischargItemLP.index}</td>
<td><input type="text" id="from" name="from" class="form-control" value="${loadDischargItem.from}"></td>
<td><input type="text" id="to" name="to" class="form-control" value="${loadDischargItem.to}"></td>
<td><input type="text" id="day" name="day" class="form-control" value="${loadDischargItem.day}"></td>
<td><input type="text" id="description" name="description" class="form-control" value="${loadDischargItem.description}"></td>
<td><input type="text" id="remarks" name="remarks" class="form-control" value="${loadDischargItem.remarks}"></td>
<td><input type="button" value="delete" class="btn btn-sm btn-success" name="del[0]" onclick="deleteItem(0)"></td>
</tr>
<%
}
%>
Charles的使用感受
本文参考:https://www.axihe.com/tools/charles/charles/tutorial.html
今天用了一款非常不错的抓包工具:Charles
Charles是一个HTTP代理/ HTTP监视器/反向代理,使开发人员能够查看其机器和Internet之间的所有HTTP和SSL / HTTPS流量。这包括请求,响应和HTTP标头(包含cookie和缓存信息)
Charles 是在 Mac 下常用的网络封包截取工具,在做 移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。
Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。
除了在做移动开发中调试端口外,Charles 也可以用于分析第三方应用的通讯协议。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议 **Chr
ome DevTool 不能满足所有调试**
正常情况下,Chrome DevTool已经满足了日常web开发的需求,但是有的特性:编辑request的参数、重定向request请求的资源、编辑response的数据,ChromeDevTool就很蛋疼了,而且查看和调试移动端资源时候Chrome也并不好用;
我常借用Charles做这些事情
- 抓取 Http 和 Https 的请求和响应,抓包是最常用的了。
- 重发网络请求,方便后端调试,复杂和特殊情况下的一件重发还是非常爽的(捕获的记录,直接repeat就可以了,如果想修改还可以修改)。
- 修改网络请求参数(客户端向服务器发送的时候,可以修改后再转发出去)。 网络请求的截获和动态修改。
- 支持模拟慢速网络,主要是模仿手机上的2G/3G/4G的访问流程。
- 支持本地映射和远程映射,比如你可以把线上资源映射到本地某个文件夹下,这样可以方面的处理一些特殊情况下的bug和线上调试(网络的css,js等资源用的是本地代码,这些你可以本地随便修改,数据之类的都是线上的环境,方面在线调试);
- 可以抓手机端访问的资源(如果是配置HOST的环境,手机可以借用host配置进入测试环境)
Deepin的使用感受
前段时间给朋友买了一台MateBook14, 自带Linux系统是Deepin. 装Windows之前玩了一会儿, 给我的感觉很惊艳.
最近一段时间稍微空下来. 装了Deepin体验一下.
界面方面:
UI给我的感觉挺好, 其中效率模式偏向于Win的任务栏, 时尚模式偏向于Mac的坞.不管哪种模式, 比起Ubuntu感觉好看很多.
当然, 少不了最近时间火热的暗黑模式.
一些常用的快捷键, 和Win差不多, 用起来也很顺手.
一些东西能看到从Mac上借鉴的影子, 文件管理器, 截图.
使用:
在使用的过程当中, 也有很多惊喜.
终端漂亮, 内置了vim一些常用工具.
自带QQ,Chrome,网易云音乐.输入法不仅有搜狗拼音还有搜狗五笔.还有WPS一套,虽然这东西在Linux下用的比较少, 不过WPS总归是比LibreOffice要好很多.
应用生态:
Deepin的应用商店用起来很舒服.常用的微信,百度云盘, VLC播放器一类的东西都能在里面找到.
使用自带QQ的时候无法登录, 应该是前几天腾讯禁止历史版本登录的缘故. 在应用商店下载了个轻聊版的,能用.
值得一提的里面竟然能找到PyChram专业版, 版本紧跟. 点选安装了之后直接能启动使用. 这就让我很愉快.
省的折腾,十分方便.
唯一自带的QQ有点问题, 不过是因为前段时间开始,腾讯拒绝历史QQ版本的登录请求. 换TIM或轻聊版就行.
从安装系统, 到配置好搬砖环境, 整个过程只需要两到三个小时, (我梳理多系统引导还用了点时间)
这速度简直迅捷, 要搁Ubuntu上, 我还在吭哧吭哧捣腾输入法呢.
总结:
不得不说Deepin是很了解程序员的, 最起码很了解国内程序员.
UI设计给人的感觉是简洁大方又好看. 应用生态就是简单,高效,快捷.
应用生态也知道国内的程序员需要些什么,很简单就能够构建出来适合生产的环境, 不闹心, 不折腾.
整个系统营造的感觉就是: "别墨迹了, 快愉快的搬砖吧!"
呐, 如果之后有人让我推荐Linux系统个人用. 我会这样告诉他:
如果你不熟悉Linux系统, 那么用Ubuntu, 它会强迫你在接受它的时候不断的去折腾, 不断的去学习.
如果你想要一个工作环境, 那么Deepin真的是个很好的选择.
如果你做的Web后端, 小伙别想了, Mac都没这个好使, 省五千买猪肉吃不香么
感谢Deepin为我节省下来的时间, 能让我在这里写一些于它利好的文字.
###
关于Win10+MacOS+Deepin同盘三系统的安装方法:
请参考之前写的 <win10+MacOS+Ubuntu同盘三系统>
把ubuntu替换成deepin就大致相同了.
唯一不通的点在于, Deepin的Boot挂载点需要1.5G左右的空间. 我给了2G.
在更改EFI启动的时候, 有一些很有意思的现象:
Deepin系统安装后, 会生成两个启动项, 一个是deepin,一个是Ubuntu.(注意: 整个盘中没有Ubuntu)
在Clever中, 不管选择哪个, 最后都会导向deepin的grub.
但是在单独删除了Ubuntu的EFI之后, deepin的EFI无法完成导向.
单独删除deepin后, Ubuntu依旧能够导向deepin的grub.
尝试把名称为ubuntu的EFI名称更改为deepin,再次无法完成导向.
所以, 现在依旧是一个名字叫ubuntu的EFI帮我导向deepin系统.
考虑到deepin在之前是基于Ubuntu开发的情况, 可能在EFI这一块儿一直维系使用Ubuntu转导的传统...emmm,咱利好文章来着.
所幸这一点影响不大, 强迫症没那么厉害的情况下, 完全可以忽视.
想要尝试这四个系统同盘或者Ubuntu+deepin的小伙伴, 可以放弃EFI方案了.
PS:
社区里面有Deepin的稳定性差的说法.
我再多用段时间, 真有问题回头删帖, 手动狗头.
系统截图:
时尚模式:
高效模式:
Deepin Bug记录
关于谈谈 dva 和 mobx 的使用感受和dva和mobx区别的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AgGrid 框架的使用感受及前景分析、beetl 的使用感受、Charles的使用感受、Deepin的使用感受等相关知识的信息别忘了在本站进行查找喔。
本文标签: