react获取id_解决React应用界面开发常见痛点(一)业务逻辑与UI分离

前言:本系列是针对于React在界面开发痛点的一些解决方案,只是React应用中偏向展示的一环

构建一个业务与UI分离的react应用

本篇是基于HOC方案并未使用Hooks

业务逻辑与UI

在编写一个react组件前,我们一定要弄清两件事。

  1. 什么是UI?
  2. 什么是业务逻辑?

UI:组件的具体展示元素,通俗点就是组件的长相。接受到合理的数据就可以展示出一个合格的组件。

业务逻辑:获取数据、发送请求等等有比较明确的独特业务的逻辑。

为什么要业务逻辑与UI分离?

在编写react组件的时候,经常会出现业务逻辑相似,UI基本相同的组件,可能只是获取的数据方式有一些不同。

for example: 掘金的感兴趣小册列表为例子

d05d6ab63a1c16078af64e4bc9ff2a0c.png
  1. 最外层的红框为这个小册的组件Booklet
  2. 左侧的是小册的封面
  3. 右侧上方的是小册的名称
  4. 购买人数
  5. 小册的链接

以上这些都是Booklet组件的UI元素

在Component中:

Booklet组件只需要知道以下数据就可以正常工作:

  1. 小册的封面(imageUrl)
  2. 小册的名称(name)
  3. 购买人数(buyerNums)
  4. 链接(link)

UI组件并不需要知道:

  1. 如何获取数据,(如何根据小册id如何获取到的)
  2. 数据何时回来,(请求结束填充数据)
  3. 请求的具体处理,(请求开始、结束、容错、什么时候开始loading等等)

以上这些应该在哪里处理?

在Container中

  1. 根据小册ID获取数据。
  2. 判断请求的当前状态。(loading、error、success、cancel)。
  3. 制作好数据传递给Component

想要分离UI与业务逻辑时遇到的常见痛点

  1. 生命周期中包含请求代码,不好抽离。
  2. 内部state导致组件后续扩展能力差。

如何解决以上问题。

recompose可以合理解决以上问题。

在传统的写法中:

path: components/card/index.jsxclass Card extends React.PureComponent {      state = {            name: undefined,    link: undefined,    buyerNum: undefined,    logoUrl: undefined,  }   componentDidMount() {    getCardById(this.props.id).then(card => {      const {name ,link, buyerNum, logoUrl} = card;      this.setState({        name,        link,        buyerNum,        logoUrl,      })    });  }  render() {    const {name ,link, buyerNum, logoUrl} = this.state;    return (      
{name}
{name}
{buyerNum}人已购买
试读
)}}

上面的代码就是标准的业务与UI不分离

难以维护的影响

后续需求仍然使用这个卡片组件的UI,但是变成了卡片列表包含多个卡片,使用卡片id获取卡片数据的业务逻辑就很不合理。

如何解决?

UI与业务分离

UI层

ff8bb4b36fd6fba92f84e086daf7d8e1.png

业务逻辑层

1bd8b64fb6c6ffe7634b9d7c76d362d5.png

新的代码种Card的UI组件不再被任何业务逻辑干扰。Card的container包含了本次根据id获取卡片的业务逻辑。如果后续需要卡片列表。只需要一个CardList的container去获取数据,渲染Card的UI组件。

UI与业务分离的思路已经讲完了。

下一期会讲一讲reselect这个简洁的第三方库如何减少react组件无意义的render。

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

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

相关文章

(二十六)【2021 WWW】Knowledge-Preserving Incremental Social Event Detection via Heterogeneous GNNs

题目: Knowledge-Preserving Incremental Social Event Detection via Heterogeneous GNNs 中文题目: 基于异构gnn的知识保持增量社会事件检测 学习目标 学习怎么知识增强的? 学习怎么处理时间等多个因素的? 学习怎么构建子图…

LeetCode 931. 下降路径最小和(动态规划)

1. 题目 给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。 下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。 示例: 输入:[[1,2,3],[4,5,6…

IL应用之——用IL分析接口的本质

IL反编译利器——Ildasm.exe和Reflector.exe:一:Ildasm.exe简介 这一微软VS自带工具,在上一篇博文《初识Ildasm.exe——IL反编译的实用工具》中已经做了详细介绍,这里不再鳌述;二:Reflector.exe简介 至此(1…

自定义_如何自定义协议

前言何为自定义协议,其实是相对标准协议来说的,这里主要针对的是应用层协议;常见的标准的应用层协议如http、ftp、smtp等,如果我们在网络通信的过程中不去使用这些标准协议,那就需要自定义协议,比如我们常用…

vs 2008 Ide 设置

/Files/chenhs/CurrentSettings-2009-08-02.rar/Files/chenhs/vs2005_vs2008_scottgu_vssetings.rar 转载于:https://www.cnblogs.com/chenhs/archive/2010/02/05/1664095.html

(二十七)【2021 WWW】Learning Intents behind Interactions with Knowledge Graph for Recommendation

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpZWgm7T-1634540652258)(C:\Users\小轩\AppData\Roaming\Typora\typora-user-images\image-20211018091530075.png)] 创新性 提出了新的GNN聚合方案提出了意图图,每个意图图是将每个inte…

LeetCode 949. 给定数字能组成的最大时间(暴力)

1. 题目 给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。 最小的 24 小时制时间是 00:00,而最大的是 23:59。 从 00:00 (午夜)开始算起,过得越久,时间越大。 以长度为 5 的字符…

校验json格式_格式化展示,校验错误,编辑JSON,这几个JSON工具一定不能错过

今天给大家介绍几个常用JSON的工具,基本上能满足你工作中对JSON的所有需求google插件 JSONView安装好插件后,格式化接口返回的JSON,还能展开节点和关闭节点,超级方便格式化本地JSON,检验错误JSON Viewer网页版将杂乱的…

LeetCode 929. 独特的电子邮件地址

1. 题目 每封电子邮件都由一个本地名称和一个域名组成,以 符号分隔。 例如,在 aliceleetcode.com中, alice 是本地名称,而 leetcode.com 是域名。 除了小写字母,这些电子邮件还可能包含 ‘.’ 或 ‘’。 如果在电…

推荐系统常用评价指标和代码实现

评价指标 Recall 名称: 召回率(真阳性率) 意义:在推荐系统中,我们只关心正确推荐的有多少,也就是用户真实喜欢的,并不会关心推荐错的,所以我们用召回率,而不是准确率&a…

哥谈的是语言,不是寂寞

经常看到一些文章在谈论语言,例如“哪个语言更有前途”,“语言选择是否关键”。我是个语言粉丝,但是看到这些文章总有一些奇怪的感觉。因为在我看来,这些文章谈的东西都不是我眼中的语言——可能与国内技术环境有关,语…

python timeit用法_十大Python开发技巧

Python开发指南, 超级实用足以让您震撼> Photo by Christina Morillo from StockSnap时不时地,当我了解Python的新功能时,或者我发现其他一些人不知道该功能时,我会记下它。在过去的几周中,我最近了解或实现了一些有趣的功能-S…

python编程中的经验(一直更新)

文章目录1. python基础语法1.1 怎么让两个list或者其它可以迭代的放到一起1.2 random.choice(x, n, replaceTrue) numpy中从某个数据集中选择1.3 如何根据key返回字典的value1.4 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all…

LeetCode 953. 验证外星语词典

1. 题目 某种外星语也使用英文小写字母,但可能顺序 order 不同。 字母表的顺序(order)是一些小写字母的排列。 给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序…

Cairngorm初学者入门教程 第六节--Cairngorm中Command利用Delegate与Service连接

在上一节,我们利用FrontController 去映射 Event与Command 在这一节我们主要针对Command这部分动作做介紹。在RIA应用程序中,不可或缺的部份就是跟后台服务器连接进行数据传递。Command通过Delegate去做Services的部份(包含Remoting,WebServices,…等) C…

3d点击_3D打印服务加工在医疗器械行业的应用

3D打印技术如今已经很常见的出现在了我们日常的制造生产中。普通的3D打印机从最开始的几万块到如今的几千块,设备价格的降低也使得3D打印技术普及率的增加,而技术的普及也推动着技术的发展。3D打印开始应用到许多行业当中,下面悟空打印坊3D打…

LeetCode 1033. 移动石子直到连续

1. 题目 三枚石子放置在数轴上&#xff0c;位置分别为 a&#xff0c;b&#xff0c;c。 每一回合&#xff0c;我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。 从位置 x 或者是位置 z 拿起一枚石子&#xff0c;并将该石子移动到某一整数位置 k 处&#xff0…

所有算法库的使用(sklearn,scipy)

文章目录1. sklearn1.1 sklearn.preprocessing 之 fit 和 transform 以及 fit_transform1.2 算法之 fit 和 predict和predict_proba1.3 predict_proba1.4 各种评测指标1.4.1 R2R^2R21.4.2 准确度、精准率、召回率1.4.3 平均绝对误差(MAE)和均方误差(MSE)1.5 特征缩放 StandardS…

Perl文档操作选项

文件测试操作符 操作符 描述 -b 是否为块设备 -c 是否为字符设备 -d 是否为目录 -e 是否存在 -f 是否为普通文件 -g 是否设置了setgid位 -k 是否设置了sticky位 -l 是否为符号链接 -o 是否拥有该文件 -p 是否为管道 -r 是否可读 -s 是否非空 -t 是否表…

android aar保存图片文件异常_我去!合并AAR时踩坑了!

点击上方“刘望舒”&#xff0c;马上关注&#xff0c;早上8:42推送真爱&#xff0c;请置顶或星标作者: leeon7https://www.jianshu.com/p/8f7e32015836背景在输出Android模块时&#xff0c;有时会因为个别原因(比如来自业务的不可抗力)&#xff0c;要求将模块打包成一个文件提供…