You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.3 KiB
132 lines
3.3 KiB
import React, { createElement } from 'react';
|
|
import { findDOMNode } from 'react-dom';
|
|
import { toArrayChildren, getPartNumber, getTranslateY } from './utils';
|
|
import assign from 'object-assign';
|
|
|
|
class AntNumber extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
const children = toArrayChildren(this.props.children);
|
|
this.endSetState = false;
|
|
this.count = this.props.count;
|
|
this.data = getPartNumber(this.count);
|
|
this.timeout = null;
|
|
this.state = {
|
|
children,
|
|
};
|
|
}
|
|
|
|
getNumberOnly(index, style) {
|
|
const childrenToReturn = [];
|
|
for (let i = 0; i < 30; i++) {
|
|
let count = i >= 10 ? i % 10 : i;
|
|
childrenToReturn.push(<p key={i}>{count}</p>);
|
|
}
|
|
return createElement('span', {
|
|
className: `${this.props.prefixCls}-only`,
|
|
style: style,
|
|
key: index,
|
|
}, childrenToReturn);
|
|
}
|
|
|
|
setEndState(style) {
|
|
this.endSetState = true;
|
|
style.transition = 'none';
|
|
}
|
|
|
|
getNumberElement(props) {
|
|
const count = props.count;
|
|
if (!count || count === '') {
|
|
return null;
|
|
}
|
|
const length = count.toString().length;
|
|
const data = getPartNumber(count);
|
|
const height = findDOMNode(this).offsetHeight;
|
|
const differ = count - this.count;
|
|
let childrenWap = [];
|
|
let i = 0;
|
|
while (i < length) {
|
|
const oneData = data[i];
|
|
const style = {};
|
|
let translateY = -(oneData + 10) * height;
|
|
//判断状态
|
|
const Y = getTranslateY(differ, data, this.data, height, i);
|
|
translateY = typeof Y === 'number' ? Y : translateY;
|
|
if (count !== this.count) {
|
|
this.setEndState(style);
|
|
}
|
|
style.transform = `translateY(${translateY}px)`;
|
|
const children = this.getNumberOnly(i, style);
|
|
childrenWap.unshift(children);
|
|
i++;
|
|
}
|
|
this.data = data;
|
|
this.count = count;
|
|
return childrenWap;
|
|
}
|
|
|
|
updateChildren(props) {
|
|
if (typeof props.count === 'string') {
|
|
this.data = getPartNumber(this.props.max);
|
|
this.count = this.props.max;
|
|
return this.setState({
|
|
children: [props.count],
|
|
});
|
|
}
|
|
const newChildren = this.getNumberElement(props);
|
|
if (newChildren && newChildren.length) {
|
|
this.setState({
|
|
children: newChildren,
|
|
}, ()=> {
|
|
if (this.endSetState) {
|
|
this.updateChildren(props);
|
|
this.endSetState = false;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
animEnd() {
|
|
clearTimeout(this.timeout);
|
|
this.timeout = setTimeout(()=> {
|
|
if (typeof this.props.callback === 'function') {
|
|
this.props.callback();
|
|
}
|
|
}, 300);
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.updateChildren(this.props);
|
|
}
|
|
|
|
componentWillReceiveProps(nextProps) {
|
|
this.updateChildren(nextProps);
|
|
this.animEnd();
|
|
}
|
|
|
|
render() {
|
|
const childrenToRender = this.state.children;
|
|
const props = assign({}, this.props, {className: `${this.props.prefixCls} ${this.props.className}`});
|
|
return createElement(this.props.component, props, childrenToRender);
|
|
}
|
|
}
|
|
|
|
AntNumber.defaultProps = {
|
|
prefixCls: 'ant-number',
|
|
count: null,
|
|
max: null,
|
|
component: 'sup',
|
|
callback: null,
|
|
};
|
|
|
|
AntNumber.propTypes = {
|
|
count: React.PropTypes.oneOfType([
|
|
React.PropTypes.string,
|
|
React.PropTypes.number
|
|
]),
|
|
component: React.PropTypes.string,
|
|
callback: React.PropTypes.func,
|
|
max: React.PropTypes.number,
|
|
};
|
|
|
|
export default AntNumber;
|
|
|