在实际开发项目中,我将所有的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组件划分的纠结到总结的更多相关文章

  1. React组件开发

    目录: 属性:props 内联样式 状态记忆 : state 生命周期 访问DOM 表单输入 承接快速入门篇:http://www.cnblogs.com/jasonnode/p/4444504.ht ...

  2. React 组件开发注意事项

    0.state的设定原则,如果render里用不到,则就不应该是一个state. 1.数组遍历时,用每一条数据的唯一标识作为key,尽量不要使用遍历的索引值作为key,如果它们从不重新排序,它们工作也 ...

  3. 第二章 设计高质量的React组件

    第二章 设计高质量的React组件 高质量React组件的原则和方法: 划分组件边界的原则: React组件的数据种类: React组件的生命周期. 2.1 易于维护组件的设计要素 1.高内聚:指的是 ...

  4. React 组件性能优化探索实践

    转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效. ...

  5. webpack 打包一个简单react组件

    安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx ...

  6. React 组件性能优化

    React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...

  7. React组件属性部类(propTypes)校验

    React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...

  8. 使用reflux进行react组件之间的通信

    前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...

  9. 野心勃勃的React组件生命周期

    当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台. React组件    React实现了UI=Fn(St ...

随机推荐

  1. html页面转jsp后 乱码问题。

    在jsp文件中的html显示乱码是因为服务端和客户端的编码不一致导致的.如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码.解决办法:1.未指定使用字符集 ...

  2. Java学习--泛型

    个人理解,所谓的泛型就是将数据类型像参数(称为类型参数或者泛型参数)一样传入类,接口或者方法中,这个类型参数可以当作普通的数据类型,进行变量的声明(成员变量,局部变量(包括方法参数)),指明返回值类型 ...

  3. Python3 获取本机 IP

    通过 UDP 获取本机 IP,没有任何的依赖,也没有去猜测机器上的网络设备信息,而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的 ...

  4. CSS 图像高级 径向渐变

    径向渐变 径向渐变使用 radial-gradient 函数语法. 这个语法和线性渐变很类似, 可以指定渐变结束时的形状 以及它的大小. 默认来说,结束形状是一个椭圆形并且和容器的大小比例保持一致. ...

  5. Java属性中指定Json的属性名称

    只需要使用注解"@JsonProperty(value = "pwd")" import com.fasterxml.jackson.annotation.Js ...

  6. python入门(十二):面向对象

    1.场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物出现在屏幕的地点. 可以使用字典来进行记录: {&quo ...

  7. IoU

    IoU #include <cstdio> #include <algorithm> #define re(i,a,b) for(int i=a;i<=b;i++) us ...

  8. 在Html页面中调用ajax代码

    以最原始的XMLHttpRequest形式,实现ajax. 封装的方法 1 /** 2 * 发送一个 AJAX 请求 3 * @param {String} method 请求方法 4 * @para ...

  9. 初步了解Spring

    1.了解“控制反转” 控制反转也称为依赖注入,是面向对象编程中的一种设计理念,用来降低程序代码之间的耦合度. 下面是一个最简单的打印机实例 纸张接口,纸张有大小 继承它的有两个类,两种纸张大小的类 A ...

  10. Linux Apache虚拟主机配置方法

    apache 虚拟主机配置 注意: 虚拟主机可以开很多个 虚拟主机配置之后,原来的默认/etc/httpd/httpd.conf中的默认网站就不会生效了 练习: 主机server0 ip:172.25 ...