在实际开发项目中,我将所有的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. Django分页器的设置

    Django分页器的设置 有时候在页面中数据有多条时很显然需要进行分页显示,那么在python中django可以这样设置一个分页处理 怎么样去设置呢? 我们要用到  Django  中的  Pagin ...

  2. 常用mvn坐标

    mysql-connector <dependency> <groupId>mysql</groupId> <artifactId>mysql-conn ...

  3. JVM-如何判断对象存活与否与CMS收集器和G1收集器的区别

    JVM如何判断对象存活? 1.计数器 2.可达性分析   (很多主流语言采用这种方法来判断对象是否存活) 计数器:每当有一个地方引用该对象时,计数器 +1:引用失效则 -1: 优点:实现简单,判定效率 ...

  4. mysql 采样查询 / 间隔查询 / 跳跃查询的两种实现思路

    先创建一张测试表 CREATE TABLE `test` ( `id` ) DEFAULT NULL, `) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET= ...

  5. SQL Server 常用SQL

    --查询所有表 select * from sysobjects where xtype='u' ORDER BY name ASC

  6. js,jquery备忘录

    1.var s = str.charCodeAt();转ASCII码 2.String.fromCharCode(65);转字母 3.es6 ... (扩展运算符),将一个数组转化成由逗号分割的队列. ...

  7. Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影响

    简单点讲:Sprite或MovieClip对象一旦为其添加了Enter_Frame事件监听,对应的Enter_Frame处理函数将会马上被调用,并一直执行下去(不管你是否将其addChild到显示列表 ...

  8. php 配置xdebug

    https://blog.csdn.net/Alan8865/article/details/81331252

  9. fuchsia 内核

    1 内核zircon 是c++写的,system call是重写的,不兼容POSIX https://fuchsia.googlesource.com/zircon/+/HEAD/docs/conce ...

  10. jq动画设置图片抽奖

    (因为自己是前端刚入门的小白所以中间出现很多问题,不过这对于我来说就是一次经验的积累) 预想效果:点击"开始",图片循环旋转,不是同时的效果,而是有一定的时间差.点击"开 ...