jimu-mobile
Version:
积木组件库助力移动端开发
90 lines (81 loc) • 2.27 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
class Switch extends React.Component {
static propTypes = {
radioName: PropTypes.string,
isOpen: PropTypes.bool,
clickBack: PropTypes.func,
disabled: PropTypes.bool,
}
static defaultProps = {
openVal: 0, // 展开值
closeVal: 1, // 关闭值
radioName: 'radio01', // radio name
isOpen: false, // 展开状态
clickBack() {}, // 点击回调函数
isSmall: false, //
disabled: false, // 值为 true 时,滑块为禁用状态
}
constructor(props) {
super(props);
this.state = {
isOpen: this.props.isOpen,
radioVal: this.props.isOpen ? this.props.openVal : this.props.closeVal,
disabled: this.props.disabled,
isReader: false,
};
this.radioFun = this.radioFun.bind(this);
}
componentWillReceiveProps(nextProps) {
if (nextProps.disabled !== this.props.disabled) {
this.state = {
disabled: nextProps.disabled,
};
}
if (nextProps.isOpen !== this.props.isOpen) {
this.state = {
isOpen: nextProps.isOpen,
};
}
}
radioFun() {
const { isOpen, disabled } = this.state;
if (disabled) {
return;
}
this.setState({
isOpen: !isOpen,
radioVal: !isOpen ? this.props.openVal : this.props.closeVal,
isReader: true,
});
if (this.props.clickBack) {
this.props.clickBack({
isOpen: !isOpen,
radioVal: !isOpen ? this.props.openVal : this.props.closeVal,
});
}
}
render() {
const { radioName, isSmall, className } = this.props,
{
isOpen, radioVal, isReader, disabled,
} = this.state,
cls = classNames({
'ui-switch': true,
'jimu-switch-issmall': isSmall,
'switch-open': isOpen && !isReader,
'switch-open-move': isOpen && isReader,
'switch-close': !isOpen && !isReader,
'switch-close-move': !isOpen && isReader,
'switch-disabled': disabled,
[className]: className,
});
return (
<div className={cls} onClick={this.radioFun}>
<input type="radio" name={radioName} value={radioVal} />
</div>
);
}
}
export default Switch;