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 相关文章推荐
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
JavaScript 参数中的数组展开 [译]
Sep 21 Javascript
jQuery实现自定义事件的方法
Apr 17 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
May 31 Javascript
有关jQuery中parent()和siblings()的小问题
Jun 01 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
解决VUEX刷新的时候出现数据消失
Jul 03 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
node.js中 redis 的安装和基本操作示例
Feb 10 Javascript
微信小程序实现下拉加载更多商品
Dec 29 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
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
详解写好JS条件语句的5条守则
2019/02/28 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python实现词法分析器
2019/01/31 Python
详解python中的模块及包导入
2019/08/30 Python
python psutil监控进程实例
2019/12/17 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
不听老师话的万能检讨书
2014/10/04 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
地道战观后感300字
2015/06/04 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python