Home Reference Source Repository

src/components/form/Stepper.js

/**
 * @author haw
 */

import React, {
  PropTypes
} from 'react';
import {classNames} from '../util';

const prefix = 'stepper';

/**
 * 步进器
 * @param {Object} props 组件所使用的属性
 * @param {number} [props.value=0] 滑块的值
 * @param {number} [props.min=-Infinity] 滑块的最小值
 * @param {number} [props.max=Infinity] 滑块的最大值
 * @param {number} [props.step=1] 步进数
 * @param {function} [props.onChange] 步进器改变值时触发的函数回调
 */
export default function Stepper(props) {
  const {
    value,
    min,
    max,
    step,
    onChange,
    className,
    ...rest
  } = props;
  let clazz = classNames(prefix, {
    [className]: className
  });
  let cutClazz = classNames(`${prefix}-cut`, {
    disabled: value === min ? 'disabled' : ''
  });
  let addClazz = classNames(`${prefix}-add`, {
    disabled: value === max ? 'disabled' : ''
  });

  return (
    <div className={clazz} {...rest}>
      <a className={cutClazz} onClick={() => {
        let current = value - step;

        if (current >= min) {
          onChange && onChange(current, value, step);
        }
      }}></a>
      <a className={addClazz} onClick={() => {
        let current = value + step;

        if (current <= max) {
          onChange && onChange(current, value, step);
        }
      }}></a>
    </div>
  );
}

Stepper.propTypes = {
  value: PropTypes.number,
  min: PropTypes.number,
  max: PropTypes.number,
  step: PropTypes.number,
  onChange: PropTypes.func,
  className: PropTypes.string
};

Stepper.defaultProps = {
  value: 0,
  step: 1,
  min: -Infinity,
  max: Infinity
};