import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import Checkbox from './Checkbox'; import PureRenderMixin from 'rc-util/lib/PureRenderMixin'; export interface CheckboxOptionType { label: string; value: string; disabled?: boolean; } export interface CheckboxGroupProps { /** 默认选中的选项 */ defaultValue?: Array; /** 指定选中的选项 */ value?: Array; /** 指定可选项 */ options?: Array | Array; /** 变化时回调函数 */ onChange?: (checkedValue: Array) => void; disabled?: boolean; style?: React.CSSProperties; prefixCls?: string; className?: string; } export interface CheckboxGroupState { value: any; } export default class CheckboxGroup extends React.Component { static defaultProps = { options: [], prefixCls: 'ant-checkbox-group', }; static propTypes = { defaultValue: PropTypes.array, value: PropTypes.array, options: PropTypes.array.isRequired, onChange: PropTypes.func, }; constructor(props) { super(props); this.state = { value: props.value || props.defaultValue || [], }; } componentWillReceiveProps(nextProps) { if ('value' in nextProps) { this.setState({ value: nextProps.value || [], }); } } shouldComponentUpdate(...args) { return PureRenderMixin.shouldComponentUpdate.apply(this, args); } getOptions() { const { options } = this.props; // https://github.com/Microsoft/TypeScript/issues/7960 return (options as Array).map(option => { if (typeof option === 'string') { return { label: option, value: option, } as CheckboxOptionType; } return option; }); } toggleOption = (option) => { const optionIndex = this.state.value.indexOf(option.value); const value = [...this.state.value]; if (optionIndex === - 1) { value.push(option.value); } else { value.splice(optionIndex, 1); } if (!('value' in this.props)) { this.setState({ value }); } const onChange = this.props.onChange; if (onChange) { onChange(value); } } render() { const { prefixCls, className } = this.props; const options = this.getOptions().map(option => ( this.toggleOption(option)} className={`${prefixCls}-item`} key={option.value} > {option.label} )); const classString = classNames(prefixCls, className); return (
{options}
); } }