React中如何拆分组件

news2024/11/18 7:33:01

基于自己工作中的体会,还有在做的过程中翻阅的资料,看的资料没有收藏起来,很想指出具体的出处,但是很多都是从各个地方看到的。不过都是在掘金、公众号前端开发、还有知乎上看到的。

😫 前言

随着web业务越来越复杂,一个页面必须要分成多个部分才能使得代码逻辑更加的清晰,出了问题也能更加快速的定位。所以说如果分组件的重要性不言而喻。

一、基本原则

  • 每个组件不能超过300行:网上看好多人都说是200行,但是那样实际操作的话,压力会很大的,导致很多时候会为了分组件而分组件。其实分组件的目的就是为了可读性和可维护性。为了分组件而分组件的话,很多时候写的会很散很乱,违背了分组件的原则。 一切都是为了可读性和可维护性 组件有两种类型:一种是有状态的,一种是无状态的 从不同纬度考虑的话,可以分为四种:逻辑组件(智能组件)、UI组件(木偶组件) 、路由组件、状态组件(当前工作环境等常量) 业务代码的复用高于代码的复用* 公共组件可以有自己的方法,但是数据的展示依旧是拿props。一定要在跨页面使用的情况下才放在主目录的componets中> 无论是Vue、augular还是React提倡的基于数据驱动的设计理念——程序定义好Model和View的关系,剩下的业余处理只需要关心数据变化,View的变化由框架自动执行,无需像jquery时代再去手动操作DOM。
展示组件容器组件
关注事物的展示关注事物如何工作
可能包含展示和容器组件,并且一般会有DOM标签和css样式可能包含展示和容器组件,并且不会有DOM标签和css样式
常常允许通过this.props.children传递提供数据和行为给容器组件或者展示组件
对第三方没有任何依赖,比如store 或者 flux action调用flux action 并且提供他们的回调给展示组件
不要指定数据如何加载和变化作为数据源,通常采用较高阶的组件,而不是自己写,比如React Redux的connect(), Relay的createContainer(), Flux Utils的Container.create()
仅通过属性获取数据和回调
很少有自己的状态,即使有,也是自己的UI状态
除非他们需要的自己的状态,生命周期,或性能优化才会被写为功能组件

二、组件实例(反面例子)

2.1 分享组件

功能: 一个弹框,弹出需要分享的类型、有微信好友、朋友圈、链接微信好友、短信、还有海报生产的路由带参跳转。

变量: 按钮的类型、分享出去封面的样式、分享出现带的参数(h5和小程序由于历史原因还是有一些不同的)

文件结果还是很乱的,这是由于本来最外层只有一个index.js,随着开发发现要判断的东西越来越多,所以把他逻辑都拆分了。

  • assets: 常量、参数的封装、工具库* images: 图片库* renders: 业务组件夹,三种分享类型的不同的封面样式和一个分享标题的组件* styles: 样式库* Contianer: 容器组件,把组件的三个部分的组件都包含在外* ButtonMain* CoverView* TitleVIew
  • index.js: 逻辑组件,所有逻辑的操作都在这里,参数的封装太多分离到了assets中* ShareWechat: 封装的原生微信SDK分享容器组件:

逻辑组件(智能组件):

通过容器组件爆出的props来进行控制容器组件的逻辑。

2.2 页面组件

  • index: 主页功能
  • pages:该房地产功能的其他页面
  • componet: 该功能的公共组件
  • renders: 主页的业务组件,由于主页内容太多分离出去的

即使分离来页面的各个功能,但是单单是这样引入依旧够多且长的。本来这个是我想要再分离出去。但是一想到要props这么多参数,反而影响来可读性。所以这个组件超过来500行代码。写代码的时候,不管碰到了什么问题,如果影响到了可读性,而自己会一时半会没想到怎么解决,或事件来不及的时候。永远要选择可读性。

对于组件中方法的复用:

<shareModule ref={(ref) => this.shareModuleHandle = ref}/>
// ...
test = () => {
	this.shareModuleHandle.manHdele() // 
} 

三、其他心得

之前我一直认为 代码的重复是罪恶的,是让人唾弃的! 但是看了知乎这篇文章,我发现我好像偏离的轨道,代码的封装是为了代码更容易的去维护。有一种幡然醒悟的感觉。醍醐灌顶一般!

在知乎搜索“前端写代码真的有必要封装太好么?”

觉得很好的两个问题:

  • 人的精力是有限的,多考虑大的价值。我现在在面对这么封装,是否应该封装的过程中,耗费的时间确实不少,这样是否是对的呢?肯定不是坏的,但是是否是现阶段最有意义的呢?
  • 你现在写的代码,不管公司怎么样,只要你还在写,那么你就要对自己写的代码负责。“你写的项目,你做的项目很有可能在下一个季度交给另外一个人维护,我希望接受代码的人不会在背后骂你”,多想想你未封装的代码会对他人维护带来困扰吗?

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Elasticsearch(一)--Elasticsearch概述

一、前言 从本章开始&#xff0c;我将进入elasticSearch&#xff08;后面简称es&#xff09;的学习&#xff0c;同样也是通过书籍自学&#xff0c;并且会通过自己归纳和拓展将我觉得比较值得记录的知识点分享出来&#xff0c;如果大家觉得有用的话可以和我一起学习。我打算在总…

Kotlin

目录 一、Kotlin 基础语法 1、方法函数 2、常量 val 和变量 var 3、${} 字符串模板 4、null 处理 !!. 不能为空 ?.为空不处理 ?:为空处理成 5、is 类型转换 相当于 instanceof 6、Any 相当于 Java的 Object 二、Kotlin 基本数据类型 1、基本数据类型&#xf…

AMD出招,英特尔最不想看到的对手来了

前段时间的CES上&#xff0c;AMD正式发布Ryzen 7000的3D缓存版&#xff0c;对于游戏玩家来说&#xff0c;Ryzen 7000 3D缓存版算是今年最期待的CPU。上一代的Ryzen7 5800X3D凭借超强的游戏性能和性价比&#xff0c;在德国最大的PC硬件零售商的统计中&#xff0c;甚至成为2022年…

高并发系统设计 -- 大文件业务

上传 分片断点秒传&#xff08;判断文件哈希值&#xff09; 前端不断的发送请求&#xff0c;如果用户暂停上传的话&#xff0c;那么就是前端停止发送请求就可以了。我分片了&#xff0c;而且记录了分片的相关信息&#xff0c;所以实现了断点功能。 前端把文件进行分片&#…

ftp vsftp 登录

打开windows资管管理器&#xff08;文件夹&#xff09;输入目标路径&#xff0c;如&#xff1a;ftp://192.168.1.1输入账号密码。 删除用户已保存的密码&#xff08;仅密码&#xff0c;名称记录还在&#xff09; 两种方法都可以试试&#xff0c;适用不同情况 情况-方法一&am…

Set、Map、类数组,傻傻区分不清楚?

前言 大家都知道&#xff0c;数组和对象是两种不同的数据结构&#xff0c;虽说在js数据类型中都属于Object&#xff0c;但是还是有一定的区别&#xff0c;通过字面量以及isArray、instanceof等方法&#xff0c;我们很好区分这两者。由于使用场景的原因js中衍生了很多类似的数据…

基于java(springboot+mybatis)网上音乐商城设计和实现以及论文报告

基于java(springbootmybatis)网上音乐商城设计和实现以及论文报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

Spring Boot 热部署

Spring Boot 热部署一、添加热部署框架支持二、Settings 开启项目自动编译三、开启运行中热部署四、使用 Debug 启动 (非 Run)一、添加热部署框架支持 或者右击鼠标添加依赖&#xff1a; 或者使用插件&#xff1a; 二、Settings 开启项目自动编译 三、开启运行中热部署 老版…

【数据库概论】第一章 绪论

第一章 绪论 1.1 数据库系统概述 数据库的四个基本概念 1.数据 数据是数据库中存储的基本对象&#xff0c;一般数据是描述事物的符号记录&#xff0c;这种符号记录可以输数字&#xff0c;也可以是文字、徒刑、音频等。 2.数据库 数据库是长期存储在计算机内有组织的&…

Leetcode动态规划题解

第一题 509. 斐波那契数 题目描述&#xff1a;斐波那契数&#xff08;通常用 F(n) 表示&#xff09;形成的序列称为斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) …

【计算机网络】计算机网络基础

计算机是人类社会不可或缺的工具&#xff0c;而单独的一台计算机的功能也是有限的&#xff0c;计算机需要和其它的设备相互连接通信形成的计算机网络才能对人类发展带来巨大的影响。 目录 计算机网络 通信协议 网络结构 网络边缘 接入网 网络核心 时延和吞吐量 时延 吞…

.Net Core6.0项目发布在IIS上访问404的问题

ASP.Net Core6.0项目发布在IIS上访问404的问题 进入线程池画面&#xff0c;将当前程序的线程池设为“无托管代码” 修改配置文件 Web.config&#xff0c;以下缺一不可 需要引用架包&#xff1a;Swashbuckle.AspNetCore.SwaggerUI.NetCore 6.0 自带集成了Swagger , 在发布项目时…

C++模板(函数模板、类模板)

目录 一、泛型编程 二、函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 模板参数的匹配原则 三、类模板 类模板的定义格式 类模板的实例化 四、扩展 函数模板一定是推演&#xff1f;类模板一定是指定&#xff1f; 模板的分离编译 一…

MySQL高级【行级锁】

1&#xff1a;行级锁1.1&#xff1a;介绍行级锁&#xff0c;每次操作锁住对应的行数据。锁定粒度最小&#xff0c;发生锁冲突的概率最低&#xff0c;并发度最高。应用在 InnoDB存储引擎中。 InnoDB的数据是基于索引组织的&#xff0c;行锁是通过对索引上的索引项加锁来实现的&a…

WPF中Binding数据校验、并捕获异常信息的三种方式

Binding数据校验、并捕获异常信息的三种方式 WPF在使用Binding时&#xff0c;经常需要进行数据校验&#xff0c;如果校验失败需要捕获失败的原因&#xff0c;并加以展示&#xff0c;本文主要介绍数据校验异常并捕获的三种方式。 依赖属性异常捕获 先定义一个依赖属性 publi…

【Nacos】Nacos配置中心的使用与SpringCloud整合

在微服务架构中&#xff0c;当系统从一个单体应用&#xff0c;被拆分成分布式系统上一个个服务节点后&#xff0c;配置文件也必须跟着迁移&#xff08;分割&#xff09;&#xff0c;这样配置就分散了&#xff0c;不仅如此&#xff0c;分散中还包含着冗余。配置中心将配置从各应…

哪儿有微服务开源项目?

随着数字化时代的到来&#xff0c;微服务开源项目的应用价值逐渐凸显。作为提升企业办公协作效率的低代码开发平台项目&#xff0c;其表现出来的灵活性、易操作、简便的特性&#xff0c;成为现代化办公管理中的重要合作伙伴。我们今天一起来了解什么是微服务开源项目。 一、微服…

基于JavaWeb实现蜀南调味品商城物流配货系统

一、项目介绍 本文系统利用JavaWeb技术&#xff0c;设计和实现了连接公司、客户公司、物流运输为桥梁的销售配送管理系统&#xff0c;并以网络技术和信息技术在销售配送中的应用为重点&#xff0c;实现员工登录模块、员工信息管理模块、库存管理模块、订单处理模块、包装管理模…

高通Wi-Fi 7网络芯片方案IPQ9574,IPQ9554,IPQ9514,IPQ9570,IPQ9550,IPQ9510

networking pro 1620&#xff1a;芯片型号IPQ9574&#xff0c;支持4频段16路数据流&#xff0c;峰值速率33Gbps&#xff0c;支持4个2.5G口&#xff0c;1个5G口&#xff0c;1个万兆口&#xff1b;networking pro 1220&#xff1a;芯片型号IPQ9574&#xff0c;支持3频段12路数据流…

三个案例详解不同网段之间如何互通

当然还可以通过三层交换机划分VLAN配置更好。这里主要讲通过普通路由器之间互通一台路由器连接另外一台路由器&#xff0c;这两台路由器分别连接不同的网段&#xff0c;那么如果要这两个网段互通&#xff0c;则必须配置路由&#xff0c;这个就是静态路由。案例一、不同网段之间…