从React组件划分的纠结到总结
在实际开发项目中,我将所有的React组件划分为容器组件和展示组件,展示组件其实就是一个纯函数组件,没有任何副作用,基本都是PureComponent。但是突然,出现了这么一个问题:
我有一个浮层组件Layer,它是一个展示信息明细的面板类似于这种,就比如订单下单之后,在价格边上有个查看明细,这时候点击就会弹出该浮层。我有多个页面要用到类似的浮层,因此我毫不犹豫地将它单独抽离出来。它的内容以及是否展示,由它的props来决定,也就是在容器组件内部。
但是我发现两个问题:
1,虽然浮层展示是由外部控制,但是浮层隐藏却是由浮层自己控制,比如点击浮层内部某个按钮它自动消失,那这样有两个方式:
第一,把点击消失的事件也放到外层,但是其实所有浮层组件的消失事件都是一样的,就是让它隐藏而已,如果每次调用该组件都要重复定义该动作,有些浪费。
第二,把点击消失的事件放到组件内部,然后用state来控制,至于组件展示的props,可以通过生命周期函数componentWillReceiveProps来控制state,但是这样的话又显得这个组件非常复杂,既有外部状态,又有内部状态,而且考虑到v16.3版本后该生命周期函数会被废掉,又要考虑其它的。。。
2,当容器组件非常复杂时,我为了展示一个浮层,却要把整个容器组件都re-render一遍,似乎有点因小失大。
当时我的项目技术选型,数据流管理用的是mobx,于是我决定,将它单独与一个layerStore来进行映射,它的状态监听全部放在store里,包括点击事件,这样有个好处是相当于我这个浮层组件已经脱离任何调用它的组件了,因为它的状态和事件都和那些组件无关了,它只取决于自己的store,只不过我可以在需要调用它的时候,在外部组件的事件里多写一行:layerStore.showLayer();
但是这种方式的坏处就是:
1,这个组件无法做到复用到其他项目中(如果别的项目没有用mobx,那这种绑定store的方式也就废弃了);
2,这个组件成了一个真正意义上的‘公共’组件,它不属于某个组件内的,因为它的store是公共的。我们看似公用了一个组件,但实际上,都是在操作一个store,没有办法同时存在两个不同状态的Layer。
想到这儿,我的纠结症已经快令我抓狂了。到底哪种实现方式最佳?最终我还是选择了后者,因为在当前项目中,后者一定更优一些,因为我们不存在两个浮层同时出现的情况。那如何选择实现方式,实际上是看你对组件的理解了,角度不同,实现方式自然不同。就像这个浮层组件,如果你理解的它是每个组件都拥有各自的浮层,那么你应该会选择前者,如果你理解的它是唯一一个,是公用的,它就藏在屏幕下面,只是不停地改变样子罢了,那你应该选择后者。
最后,依然要考虑到性能问题,不要捡了芝麻,丢了西瓜。
从React组件划分的纠结到总结的更多相关文章
- React组件开发
目录: 属性:props 内联样式 状态记忆 : state 生命周期 访问DOM 表单输入 承接快速入门篇:http://www.cnblogs.com/jasonnode/p/4444504.ht ...
- React 组件开发注意事项
0.state的设定原则,如果render里用不到,则就不应该是一个state. 1.数组遍历时,用每一条数据的唯一标识作为key,尽量不要使用遍历的索引值作为key,如果它们从不重新排序,它们工作也 ...
- 第二章 设计高质量的React组件
第二章 设计高质量的React组件 高质量React组件的原则和方法: 划分组件边界的原则: React组件的数据种类: React组件的生命周期. 2.1 易于维护组件的设计要素 1.高内聚:指的是 ...
- React 组件性能优化探索实践
转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效. ...
- webpack 打包一个简单react组件
安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx ...
- React 组件性能优化
React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...
- React组件属性部类(propTypes)校验
React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...
- 使用reflux进行react组件之间的通信
前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...
- 野心勃勃的React组件生命周期
当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台. React组件 React实现了UI=Fn(St ...
随机推荐
- vue项目tips
在main.js引入了封装好的各组件,包括echarts.自定义组件等
- 如何使用tensorboard查看tensorflow graph****.pb文件的模型结构
参考网上的:https://github.com/tensorflow/tensorflow/issues/8854 import tensorflow as tf from tensorflow.p ...
- 教师派day1
终于决定好要冲刺了. 昨天开了一个短会,又详细分配了一下任务. 问题是:我的android装了好久好久才可以用~ 今天要把android里的各个文件.控件搞清楚.
- kafka创建会话,报Error while executing topic command : Replication factor: 1 larger than available brokers: 0.
bin/kafka-topics.sh --create --zookeeper es1:2181 --replication-factor 1 --partitions 1 --topic top ...
- ssh登录locale报错:cannot change locale (zh_CN.UTF-8): No such file or directory
一.登录ssh报错: Last :: from 172.28.146.109 -bash: warning: setlocale: LC_ALL: cannot change locale (en_C ...
- mysql中查询的优先级
sql和mysql执行顺序,内部机制是一样的,最大的区别在别名上 一.sql执行顺序 1.from 2.on 3.join 4.where 5.group by(开始使用select中的别名,后面 的 ...
- c# webBrowser 转图片
class NativeMethods { [ComImport] [Guid("0000010D-0000-0000-C000-000000000046")] [Interfac ...
- pyautogui 文档(二):鼠标控制
0,0 X increases --> +---------------------------+ | | Y increases | | | | 1920 x 1080 screen | | ...
- 20175314薛勐 MyOD(课下作业,选做)
MyOD(课下作业,选做) 要求 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 思路 伪代码: 读取命令行输入的参数(文件名) 以16为每个字 ...
- airTest 应用到项目并优化
之前已经介绍了airTest的原理,该文主要指引大家能够将airTest框架应用到具体的测试项目当中去. 首先要考虑的是: 1. 你是用airTest 去做什么自动化 (android, ios, w ...