ButtonGroup组建的API如下:

属性 类型 说明
value string | number 当前值
defaultValue string | number 同 value,不可控
onChange func 选中事件,参数返回被选中的值

ButtonGroup组件主要是根据children通过findAllByType函数来找出子组件中的所有Button组件,然后利用React.cloneElement为每个Button添加ButtonGroup中的属性,比如key onClick

class ButtonGroup extends Component {constructor(props) {super(props)this.state = {value: 'value' in props ? props.value : props.defaultValue}}componentWillReceiveProps(nextProps) {'value' in nextProps && this.setState({value: nextProps.value})}render() {const { className, children, defaultValue, ...other } = this.propsconst items = findAllByType(children, Button)const buttons = items.map((item, index) => {if (!item) returnreturn React.cloneElement(item, {key: index,type: (item.props.value == this.state.value) ? '' : 'minor',onClick: e => {e.stopPropagation()this.handleClick(item.props.value)}})})return (<div className={classnames('bfd-button-group', className)} {...other}>{buttons}</div>)}handleClick(value) {this.setState({value})this.props.onChange && this.props.onChange(value)}
}ButtonGroup.propTypes = {// 当前值value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),// 同 value,不可控defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),// 选中事件,参数返回被选中的值onChange: PropTypes.func,customProp(props) {if ('value' in props && !props.onChange) {return new Error('You provided a `value` prop without an `onClick` handler')}}
}
export default ButtonGroup
复制代码

这里需要注意的是state中value,这个属性是每个button组件的值,而不是名字,上面的value第一个作用是用来在onChange函数作为输出,第二是用来根据item.prop.vaule===this.state.value来判断当前点击的是哪一个按钮,从而让其为默认的primary按钮,而其他未点击的为minor按钮。

我们来看看封装的findAllByType函数

import React from 'react'function isArray(v) {return Object.prototype.toString.call(v) === '[object Array]'
}const getDisplayName = (Comp) => {if (!Comp) {return ''}if (typeof Comp === 'string') {return Comp}return Comp.displayName || Comp.name || 'Component'
}
const findAllByType = (children, type) => {const result = []let types = []if (isArray(type)) {types = type.map(t => getDisplayName(t))} else {types = [getDisplayName(type)]}React.Children.forEach(children, child => {const childType = child && child.type && (child.type.displayName || child.type.name)if (types.indexOf(childType) !== -1) {result.push(child)}})return result
}
export default findAllByType
复制代码

组件源码——按钮组ButtonGroup相关推荐

  1. NET开发邮件发送功能的全面教程(含邮件组件源码)(

    天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下. AD:2013云计算架构师峰会精彩课程曝光 ...

  2. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2 ...

  3. [转].NET开发邮件发送功能的全面教程(含邮件组件源码)

    转载自http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html 今天,给大家分享的是如何在.NET平台中开发"邮件发送 ...

  4. element-ui input组件源码分析整理笔记(六)

    input 输入框组件 源码: <template><div :class="[type === 'textarea' ? 'el-textarea' : 'el-inpu ...

  5. 原来 Element 的组件源码还能这么看

    前言 作为一位有追求(但学不动)的前端开发者,我们肯定都曾想通过看组件库的源码(本章以 Element 为例)来拔高自己的水平,也肯定都尝试过,只是最终不了了之罢了.就像我也是这样的?,到现在也只看了 ...

  6. uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

    前言 网上的组件和教程代码都太乱了,根本无法按照自己的需求修改,而且基本上都有兼容性和功能性 BUG. 本文实现了 多行文本展开与折叠组件,灵活性非常高,只完成了核心功能,可随意自定义样式满足您的需求 ...

  7. 【商业版】C# ASP.NET 通用权限管理系统组件源码中的数据库访问组件可以全面支持Access单机数据库了...

    可能在5年前还用过Access单机数据库但是后来很少用了,可能平时接触的都是大型管理类系统的开发工作大部分是Oracle.SQLServer数据库上做开发的,很少做一些小网站或者单机版本的东西,所以跟 ...

  8. ASP.NET 生成唯一不重复的订单号 支持多用户并发、持多数据库的实现参考(C#.NET通用权限管理系统组件源码组成部分)...

    我们在日常开发项目过程中往往需要各种订单单号的产生方法,而且是支持多用户并发.支持多种数据库的,我们并不想为每个项目都写一些独立的代码去实现这些功能,往往需要有个通用的函数比较爽一些. 下面我们以C# ...

  9. Android一个漂亮的日历组件源码

    简介: Android 一个漂亮的日历组件源码主要特性 日历样式完全自定义,拓展性强 左右滑动切换上下周月,上下滑动切换周月模式 抽屉式周月切换效果 标记指定日期(marker) 跳转到指定日期 下载 ...

最新文章

  1. Android中获取资源文件的几种方法
  2. sqlserver 运行正則表達式,调用c# 函数、代码
  3. 算法设计与分析(第四周)大整数相乘 分治法【不能解决溢出问题】
  4. 跨域两种解决方案CORS以及JSONP
  5. java上下左右_上下左右代替maquee的滚动代码
  6. 软件测试术语 - 需求跟踪矩阵
  7. 8个经典智能穿戴设备优选电路方案合辑
  8. 嵌入式 h.264中帧与场
  9. 无领导小组讨论面试真题解析(四)
  10. 8.2 JVM命令行监控——jstat
  11. ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine
  12. RTL8812F/RTL8197F修改beacon间隔
  13. Pandas学习-Day3
  14. c++狼人杀12人标准场有发言有选警附exe文件
  15. 北京大学 软微初试复试 经验总结贴
  16. 从搬砖工到亿万富豪,这些年他经历了什么?
  17. 会议安排问题JAVA实现
  18. 公交车 自动报站功能
  19. Power BI--DAX函数高阶
  20. 最具价值和投资前景的域名系列之-SoShow(搜秀)

热门文章

  1. 2013下半年软件设计师考试体会
  2. php工作审批流程,审核流程_POSCMS_PHP开源_迅睿CMS系统
  3. JS 计算两个时间的间隔
  4. docker18.09.06 Centos安装教程
  5. 【网络编程】python网络编程多线程实现
  6. 前端性能优化--合并压缩js,减少http请求次数
  7. 融合计费打造全业务核心竞争力
  8. 智能网联汽车自动驾驶仿真技术学习笔记(一)
  9. Oracle SQL手册
  10. java 代码覆盖率_代码覆盖率统计