React组件设计模式之组合组件应用实例分析


Posted in Javascript onApril 29, 2020

本文实例讲述了React组件设计模式之组合组件应用。分享给大家供大家参考,具体如下:

这种模式本质上解决的是组件之间传值的问题。但是它对于传值以及一些内部操控的逻辑封装得更严密。

场景:希望减少上下级组件之间props的传递,简单来说就是不用传做显式地传值,来达到组件之间相互通信的目的

举例来说,某些界面中应该有Tabs这样的组件,由Tab和TabItem组成,点击每个TabItem,该TabItem会高亮,

那么Tab和TabItem自然要进行沟通。很自然的写法是像下面这样

<TabItem active={true} onClick={this.onClick}>One</TabItem>
<TabItem active={false} onClick={this.onClick}>Two</TabItem>
<TabItem active={false} onClick={this.onClick}>Three</TabItem>

这样的缺点很明显:

  • 每次使用 TabItem 都要传递一堆 props
  • 每增加一个新的 TabItem,都要增加对应的 props
  • 如果要增加 TabItem,就要去修改 Tabs 的 JSX 代码

但是,组件之间的交互我们又不希望通过props或者context来实现。希望用法如下面一样简洁。

<Tabs>
   <TabItem>第一</TabItem>
   <TabItem>第二</TabItem>
   <TabItem>第三</TabItem>
  </Tabs>

组件之间通过隐秘的方式进行通信,但这里的隐秘实际上是对props的操作在一个地方进行管理。

实现

明白了要实现的交互,和代码层面要实现的效果,就可以开始动手了。

TabItem组件有两个关键的props: active(表明当前是否应高亮),onTabClick(自己被点击时调用的回调函数),

TabItem由于是每个Tab页面的容器,它只负责把props.children渲染出来,所以用函数式组件即可。

export const TabItem = props => {
 const { active, onTabClick, children } = props
 const style = {
  color: active ? 'red' : 'green',
  cursor: 'pointer'
 }
 return <>
  <h1 style={style} onClick={onTabClick}>
   {children}
  </h1>
 </>
}

我们再来回顾一下想到达到的效果:

<Tabs>
   <TabItem>第一</TabItem>
   <TabItem>第二</TabItem>
   <TabItem>第三</TabItem>
  </Tabs>

使用组件时要避免传递props的缺点,那么在哪里传递呢?自然是是Tabs组件。但上面并没有传入props啊。

Tabs 虽然可以访问到props里边的children,但是到手的children已经是现成的如果直接改它的话,会出问题。

不可以直接改children的话,我们就把children复制一份,然后改这个复制过来的children,再渲染出去,就ok啦!

下面来看Tabs的实现:

class Tabs extends React.Component {
 state={
  activeIndex: 0
 }
 render() {
  const { activeIndex } = this.state
  const newChildren = React.Children.map(this.props.children, (child, index) => {
   if (child.type) {
     // 复制并修改children
    return React.cloneElement(child, {
     active: activeIndex === index,
     onTabClick: () => this.setState({activeIndex: index})
    })
   } else {
    return child
   }
  })
  return <div className="tabs">
   {newChildren}
  </div>
 }
}

这里需要用到React不常用的api:

  • React.Children.map
  • React.cloneElement

使用React.Children.map来对props.children进行遍历。

React.cloneElement可以复制某个元素,第一个参数是被复制的元素,第二个参数我们可以把想传入的props加进去,也就是这个时机,

我们将active和onTabClick传入。实现最终效果。

总结

这种模式比较好的把复杂逻辑完全封装起来了,抽象程度更好,比较适合开发组件开发者。针对props的扩展性也比较好,对于使用组件的开发者来说,也比较友好。

希望本文所述对大家react程序设计有所帮助。

Javascript 相关文章推荐
遍历jquery对象的代码分享
Nov 02 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
JavaScript+html5 canvas绘制的小人效果
Jan 27 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
Apr 29 Javascript
jquery删除数组中重复元素
Dec 05 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
vue下拉列表功能实例代码
Apr 08 Javascript
详解ES6 Promise对象then方法链式调用
Oct 20 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
Feb 18 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
May 21 Javascript
了解JavaScript中的选择器
May 24 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
Aug 07 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 #Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 #Javascript
JS实现手写 forEach算法示例
Apr 29 #Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 #Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 #Javascript
深入浅析vue全局环境变量和模式
Apr 28 #Javascript
你准备好迎接vue3.0了吗
Apr 28 #Javascript
You might like
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
js实现无缝滚动特效
2015/12/20 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
详解python中eval函数的作用
2019/10/22 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
pandas 对group进行聚合的例子
2019/12/27 Python
python多进程使用函数封装实例
2020/05/02 Python
如何理解python中数字列表
2020/05/29 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
招商业务员岗位职责
2013/12/16 职场文书
家教广告词
2014/03/19 职场文书
专业技术职务聘任书
2014/03/29 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
2014年就业工作总结
2014/11/26 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2015年党员个人自我评价
2015/03/03 职场文书