在实际开发项目中,我将所有的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. 学习python 检测字符串的方法

    检测字符串长度的方法:len() 检测字符串是否含有字母的方法:str.isalpha() 检测字符串是否含有数字的方法:str.isnumeric() 检测字符串是否有大写字母:str.upper( ...

  2. MySQL8.0.x免安装配置

    目录 概述 下载 配置环境变量 编辑配置文件 初始化MySQL 安装MySQL系统(Windows)服务 初始化MySQL 启动MySQL 修改默认密码 开启远程登录 概述 MySQL从5.7一下子跳 ...

  3. tabpanel如何隐藏页签表头以及基本用法总结

    tabpanel是extjs中一种比较常用的布局容器控件,也比较简单. ///1:相关的插件, var tabScrollerMenu = Ext.create("Ext.ux.TabScr ...

  4. Version Control/Git,SVN

    一.Version Control 1.什么是Version Control 版本控制(Version Control)是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置 ...

  5. crontab,定时任务执行找不到库or shell可执行,crontab 定时任务下就不能执行,tensorflow,ImportError: libcuda.so.1: cannot open shared object file: No such file or directory

    在线上启动一个定时任务,但是起来查看,发现任务执行找不到库,报cuda错误: ImportError: libcuda.so.1: cannot open shared object file: No ...

  6. 输入一段字符串,统计其中的数字,字母,空格,其他字符的方法 ----python---

    1.以简单的循环分支实现字符统计 str1 = input("输入字符串:") num=0;word=0;space=0;other=0; for i in str1: if i. ...

  7. 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 ...

  8. Json压缩工具

    一般的json文件拥有很多的空格和注释,虽然读起来比较方便,但是在运行的时候是要占一些内存的. 于是json压缩工具就应运而生了,这个工具是用java做的,原理是: 1:在Eclipse中导出一个可运 ...

  9. 解决python logging重复写日志问题

    import logging from homework.exam_homework_0413.common import contants from homework.exam_homework_0 ...

  10. python_1_基础知识

    数据类型: 整数 浮点数 字符串 布尔值:True/False 空值:None 变量 常量 int(整型):在Python3里不再有long类型了,全都是int -2**63-2**63-1即-922 ...