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. 【C++】mingw32-make+cmake:error: ‘nullptr‘ was not declared in this scope解决方法
  2. Mysql的timestamp与datetime
  3. c++语言程序的结构特点,C++的特点(特性)
  4. Java多线程系列(十一):ReentrantReadWriteLock的实现原理与锁获取详解
  5. 【agc004d】Teleporter
  6. ascii码与键盘代码的区别
  7. LabVIEW升级图像识别功能
  8. 信息系统项目管理--上午分析笔记
  9. 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
  10. 中学-知识与能力【10】
  11. 内含扩容源码的面试题,目标是手写HashMap!
  12. Linux系统常用基本命令总结
  13. 3分钟学会在C ++中以编程方式合并Excel工作表中的单元格
  14. 5.22非常虚伪的集训总结
  15. 计算机网络哈勃,美国 NASA 努力修复哈勃太空望远镜 1980 年代的计算机故障
  16. c++微信读书学习笔记——很久以前随便写的
  17. Python实例——身体质量指数BMI
  18. 简易计时闹钟设计verilog语言实现
  19. 技术岗的职业规划_技术和管理职位的职业发展道路该如何设计?(图)
  20. Sallen-Key滤波器的详细介绍

热门文章

  1. html sku效果后台,sku.html
  2. 成为自动化工程师需要学习什么——把仅有的时间放在,有意义的事情上
  3. hive sql 时间戳转换与时间的各种转换
  4. 现货黄金模拟操作建议
  5. ubuntu下搭建ad-hoc网络实现多台设备进行网络通信(通过图形界面+超级详细教程)
  6. JavaMe中的jad文件问题
  7. 百度语音合成(TTS) 在Android的使用方法
  8. 网站开发————JavaEE/实训实训实训
  9. DataView 使用技巧 [转]
  10. Python写捕鱼达人