作者 | 杨若瑜

来源 | CSDN博客,责编 | 夕颜

头图 | 付费下载自视觉中国

出品 | CSDN(ID:CSDNnews)

随着React的普及,很多大厂的前端必备React相关知识,甚至已有成熟框架应用在生产环境。今天我们探讨的是React进阶者经常会遇到的MirrorX编写问题,看着前人写的组件,绕着绕着就绕糊涂了。真实案例:可能为了改一个简单的传参,前端开发工程师会耗费在跟代码至少4-5个小时。因此我便做此文,用以帮助正在进阶过程中的前端工程师们快速理解一个RESTful请求是怎么经过MirrorX的处理,到达组件并激发组件重新渲染。此文大厂前端开发必备。

适合读者:具备React基础的程序员、用友UCF开发者、蚂蚁金服Antd开发者。

概念问答

1、什么是MirrorX?

MirrorX是基于Redux封装的一种状态机。比如实际使用的时候假设我们要从后台读个商品接口、把接口返回的数据做一些处理(比如打折的要前端计算折扣金额),然后将处理好的数据显示在界面上。想想就得用很多代码,而且都要放在组件的类里吧?

要是有一个框架,组件里只需要调一行代码就能解决,是不是很不错?MirrorX就是用来做这件事的。

2、怎么能做到1行解决?

学过面向对象编程的,应该都知道封装性可以使控制层代码更加简练。但是React里如果要处理刚才说的那件事,既需要state和props控制权,也要知道来来往往的上下文(比如当前用户是谁、VIP等级是多少),最令React程序员难受的是,当前用户信息在UserView组件里,当前的GoodsView组件没有对UserView组件的访问权。因此,需要有一个统一的地方来跨越组件的障碍,存储这些信息,把这个机制封装好了,就可以实现一行解决。

3、具体是怎样的机制?

网上有很多文章讲Redux,看完Redux,再搜索MirroX就可以知道具体的机制。简单的来说,就是系统有若干个状态仓库,我们可以把上下文变量都分门别类放在不同仓库里,比如用户信息、商品信息;放入的时候都是调用动作来实现,比如读取商品信息、更改商品数量。而动作可以选择是否调用服务,如果前台更改商品数量,直接改状态仓库里的数值即可,无需调用服务;如果调用了服务,则一般来说是功能是需要服务器交互的。

如何用MirrorX完成一个功能

这里举个请求后台读取商品列表的例子

1、环境准备

先确保你已经通过npm i安装了mirrorx、react、axios。因为本文是最佳实践,对于如何安装不做赘述。

2、写一个简单的服务(Service)

写一个service.js文件(注释多,代码其实没几行)

 1import request from "axios";2const URL={3    GET_GOODS:"api/template/GetGoods" // 声明要访问的后台接口地址4}5// 暴露出一个名为GetGoodsApi的函数,入参params是Object类型,代表提交给后台的参数列表6// 这个函数会返回一个Promise对象7export const GetGoodsApi = (params) => {8    return request(URL.GET_GOODS, {method: "post",params})9}
10// 你还可以暴露出其他函数,一个Service可以export const多个函数
11// export const GetMember = (params) => {
12//    return request(URL.GET_MEMBER, {method: "post",params})
13//}

3、写一个简单的模型层(Model,包含动作和模型)

写一个model.js(注释多,代码其实没几行)

 1import { actions } from "mirrorx";2import * as api from "./service"; // 把刚才的service.js引入进来,名称定为api34export default {5    name: "GoodsManager", // 这里写的名字将会成为状态仓库的名称6    initialState: { // 这里可以写初始化时状态机里的初始状态7        userId: "0001"8    },9    // reducer:状态机处理函数
10    reducers: {
11        // 这个updateState是默认的,它用来主动更新状态机里的各种状态
12        // state和data都是Object对象
13        // state是框架传入的,开发者调用的时候,data才是对应的第一个参数
14        // ...是ES6的对象扩展运算符,后面...data会自动覆盖...state的同名属性
15        updateState: (state, data) => ({ ...state, ...data })
16        // 后面还可以写其他的reducer,切记第一个参数一定是state
17    },
18    effects: {
19        // 动作处理函数:获取商品
20        // param是对象,getState是框架传入的函数对象,用来方便获取当前状态机的状态
21        // 开发者调用的时候,不用给getState形参赋值
22        async GetGoods(param, getState) {
23            // Promise的同步操作运算,获取Axios返回的data
24            let { data } = await api.GetGoodsApi(param);
25            // 调用当前状态机的updateState方法(也就是上面写的那个函数)
26            // 由调用可见,只放了一个Object类型的参数
27            actions.GoodsManager.updateState({ goods: data.data });
28        }
29    }
30};

4、改造组件,变成由MirrorX托管组件

第一步、在项目入口的地方添加(比如在app.js上添加在内存中创建状态机的代码):

1// 引入MirrorX的组件
2import mirror from 'mirrorx';
3// 引入刚刚写的model,注意路径
4import model from './model';
5// 调用MirrorX,根据模型创建状态机
6mirror.model(model);

第二步、在受状态机托管的组件上改一下代码

1// 增加对MirrorX的引用
2import {connect} from 'mirrorx';
3// 这里面GoodsView就是当前受状态机托管组件的class名称,GoodsManager就是第二步里name写的名字
4export default connect(state => state.GoodsManager)(GoodsView);

5、在需要调用的地方写下如下代码:

这里因为GoodsView只要一加载就需要显示商品列表,因此,我们可以把代码写在constructor(props)函数里:

1// 组件上需要引入MirrorX的actions
2import {actions} from 'mirrorx';
3// 在constructor(props)函数里写上以下调用即可
4actions.GoodsManager.GetGoods({
5    user:props.userId
6});

然后render里写一下从props.goods(叫做goods是因为第三步GetGoods方法调用updateState方法时传的就是goods,所以当前组件需要从props里接)渲染界面的前端代码,就可以开始测试了。

补充说明

状态机里所有的状态值都会被自动写在托管组件的props里,当发生变化时,也是可以从props里取出来,因此不要尝试去获取或更新组件的state。

只要状态机里的值变化,受到托管的组件会重新执行render方法,实现自动刷新。

实际开发时由于存在组件嵌套、组件元素属性值与状态机里的状态名称冲突,各种疑难杂症随之而来。介于我对于Antd、UCF等成熟框架的分析和实战,得出一个结论,大型系统的model.js、service.js一般不会超过5个,而且大多都有命名规范。

如果是看别人的代码,倒着按顺序找一遍即可,从此前端大神的代码不再难懂。

原文链接:

https://blog.csdn.net/yry0304/article/details/104853557

【End】

推荐阅读 

☞百度工程师非法挖矿获利10万、被判3年;苹果反垄断案被罚11亿欧元;GitHub拟收购NPM | 极客头条

☞拿着 22 万美元年薪,混得还不如实习生?

☞如何用Jupyter Notebook制作新冠病毒疫情追踪器?

☞出生小镇、高考不顺、复旦执教、闯荡硅谷,59 岁陆奇为何如此“幸运”?

☞DevOps 转型时如何安全融入?对企业产出有何影响?2019年 DevOps 最新现状研究报告解读 | 原力计划

☞比特币最主流,以太坊大跌,区块链技术“万金油”红利已结束 | 区块链开发者年度报告

你点的每一个在看,我认真当成了喜欢

十分钟上手 React+MirrorX,从此前端大神代码不再难懂 | 原力计划相关推荐

  1. 开发者请注意!2020年的大前端发展趋势已出炉! | 原力计划

    作者 | xiangzhihong8 责编 | Elle 出品 | CSDN 博客 迅速发展的前端开发,在每⼀年,都为开发者带来了新的关键词.2019 年已步⼊尾声,2020 年前端发展的关键词⼜将有 ...

  2. 前端大神用React刻了一个Windows XP

    近日,一前端大神sh1zuku用React刻出一個 Windows XP,页面中的两个Windows XP窗口可以自由拖曳,而且作者还制作了一个踩地雷的游戏,可以直接上手玩.作者也将这些实现的过程在m ...

  3. access 提供程序无法确定object 值_Python | 加一行注释,让你的程序提速10+倍!numba库十分钟上手指南...

    如果你在使用Python进行高性能计算,Numba提供的加速效果可以比肩原生的C/C++程序,只需要在函数上添加一行@jit的装饰.它支持CPU和GPU,是数据科学家必不可少的编程利器. 之前的文章 ...

  4. 十分钟上手 ES 2020 新特性

    作者 | 浪里行舟 责编 | 郭芮 ES2020 是 ECMAScript 对应 2020 年的版本.这个版本不像 ES6 (ES2015)那样包含大量新特性.但也添加了许多有趣且有用的特性.本文的代 ...

  5. 9个项目助你在2020年成为前端大神!

    DEV的年度热文,读完觉得不错,所以翻译出来供大家参考,个人水平有限,文中可能会有一些翻译错误,可以在评论区指正. 本篇文章一共涉及了9个流行的框架/库,没有具体的介绍使用方法,而是给了一些非常棒的实 ...

  6. 前端大神的离逝,让我们不得不有所反思。

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 259 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 1 2020庚子年像 ...

  7. 真相 | 两个前端大神给我的启示

    我有几个做前端开发的朋友.虽然他们在技术上个个都封了神,但这并不影响我们经常一块出去玩,更不影响我还是菜鸟一个,相信身边有大神朋友的同学能够理解这样一种心情. --尤其是当你遇到bug,他们投来&qu ...

  8. 想成为前端大神秒杀群雄?收下这份2020年最新前端学习路线!

    B 站视频版:点击传送 是不是梦想了好久,成为叱诧风云,挥手成页面的前端大神?那你来对地方了,这篇文章整理了成为前端大神的必备技能.先从初级前端工程师所需的技能开始,然后一路升级到高级工程师该掌握的技 ...

  9. 淘宝新品补单平台怎么样才能为你的产品精准打标?大神导航,一个神奇的网站,从此开启大神之路!

    不看你一定会后悔! 大神导航,一个神奇的网站,从此开启大神之路! 轻松导航,不仅有最新资讯,还有最近使用记录.常用推荐,方便用户使用!图标精美,良心精美.简易搜索,功能齐全,免费高质量素材任意挑选! ...

最新文章

  1. MySQL数据库开发理念_mysql之数据库基本理念
  2. java 线程数组_Java 数组线程间可见性问题
  3. 快速mysql导入sql文件_mysql肿么快速从sql文件导入数据库
  4. [SHOI2008]小约翰的游戏
  5. Android5.1.1源码 - 让某个APP以解释执行模式运行
  6. boost::detail::atomic_count相关的测试程序
  7. 高性能服务器 - window篇
  8. Java环境的正确配置你会了吗?
  9. 【华为云实战开发】11.如何快速开展嵌入式开发项目?
  10. Height、offsetWidth、ClientHeight 区别
  11. shell监控usr目录
  12. 高并发模拟( 测试 )
  13. python科学计算库-Scipy,主要讲解优化,方程求解,积分,蒙特卡洛,插值计算
  14. 一文搞懂VOS3000如何配置MicroSIP网络电话
  15. 埋藏式心脏复律除颤器的原理及参数设置
  16. 运用RapidMiner进行分类预测
  17. 永磁同步电机矢量控制(六)——MTPA最大转矩电流比控制
  18. 漫话:如何给女朋友解释灭霸的指响并不是真随机消灭半数宇宙人口的?
  19. ndt_matching解读
  20. 权御天下计算机音乐数字乐谱,权御天下-洛天依-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...

热门文章

  1. js获取网页高度和宽度(备份)
  2. #define与const定义常量的区别
  3. Xcode引入了第三方的类库之后真机调试提示莫名其妙的错误
  4. Adhesive框架系列文章--报警处理流程使用实践
  5. javascript学习笔记之document对象、表单及表单元素、脚本化cookie
  6. Linux用树形结构显示目录结构
  7. ROS安装与报错记录
  8. yolo模型部署——tensorRT模型加速+triton服务器模型部署
  9. jni 结构体转对象_JVM系列(一)JVM启动流程和基本结构
  10. python中的random模块_Python中的random模块