taro-material
Version:
Mini Program components that implement Google's Material Design.
144 lines (130 loc) • 4.54 kB
JavaScript
import Nerv from "nervjs";
import Taro from "@tarojs/taro-h5";
import { View, Text } from '@tarojs/components';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import AtButton from "../button/index";
import AtComponent from "../../common/component";
const MIN_MAXPAGE = 1;
const getMaxPage = (maxPage = 0) => {
if (maxPage <= 0) return MIN_MAXPAGE;
return maxPage;
};
const createPickerRange = max => {
const range = new Array(max).fill(0).map((val, index) => index + 1);
return range;
};
export default class AtPagination extends AtComponent {
constructor() {
super(...arguments);
const { current, pageSize, total } = this.props;
const maxPage = getMaxPage(Math.ceil(total / pageSize));
this.state = {
current,
maxPage,
pickerRange: createPickerRange(maxPage)
};
}
onPrev() {
let { current } = this.state;
const originCur = current;
current -= 1;
current = Math.max(1, current);
if (originCur === current) return;
this.props.onPageChange && this.props.onPageChange({ type: 'prev', current });
this.setState({ current });
}
onNext() {
let { current } = this.state;
const originCur = current;
const { maxPage } = this.state;
current += 1;
current = Math.min(maxPage, current);
if (originCur === current) return;
this.props.onPageChange && this.props.onPageChange({ type: 'next', current });
this.setState({ current });
}
componentWillReceiveProps(props) {
const { total, pageSize, current } = props;
const maxPage = getMaxPage(Math.ceil(total / pageSize));
if (maxPage !== this.state.maxPage) {
this.setState({
maxPage,
pickerRange: createPickerRange(maxPage)
});
}
if (current !== this.state.current) {
this.setState({ current });
}
}
onPickerChange(evt) {
const { value } = evt.detail;
const current = +value + 1;
if (current === this.state.current) return;
this.props.onPageChange && this.props.onPageChange({ type: 'pick', current });
this.setState({
current
});
}
render() {
const {
icon,
// pickerSelect,
customStyle
} = this.props;
const {
current,
maxPage
// pickerRange,
} = this.state;
const rootClassName = ['at-pagination'];
const prevDisabled = maxPage === MIN_MAXPAGE || current === 1;
const nextDisabled = maxPage === MIN_MAXPAGE || current === maxPage;
const classObject = {
'at-pagination--icon': icon
};
return <View className={classNames(rootClassName, classObject, this.props.className)} style={customStyle}>
<View className="at-pagination__btn-prev">
{icon && <AtButton onClick={this.onPrev.bind(this)} size="small" disabled={prevDisabled}>
<Text className="at-icon at-icon-chevron-left"></Text>
</AtButton>}
{!icon && <AtButton onClick={this.onPrev.bind(this)} size="small" disabled={prevDisabled}>上一页</AtButton>}
</View>
<View className="at-pagination__number">
<Text className="at-pagination__number-current">{current}</Text>/{maxPage}
</View>
<View className="at-pagination__btn-next">
{icon && <AtButton onClick={this.onNext.bind(this)} size="small" disabled={nextDisabled}>
<Text className="at-icon at-icon-chevron-right"></Text>
</AtButton>}
{!icon && <AtButton onClick={this.onNext.bind(this)} size="small" disabled={nextDisabled}>下一页</AtButton>}
</View>
{/* {pickerSelect && <View className='at-pagination__number'>
{<Picker mode='selector' range={pickerRange} value={current - 1} onChange={this.onPickerChange.bind(this)}>
<Text className='at-pagination__number-current'>{current}</Text>/{ maxPage }
</Picker>}
</View>} */}
{/* {!pickerSelect && <View className='at-pagination__number'>
<Text className='at-pagination__number-current'>{current}</Text>/{ maxPage }
</View>} */}
</View>;
}
}
AtPagination.defaultProps = {
current: 1,
total: 0,
pageSize: 20,
icon: false,
pickerSelect: false,
customStyle: {},
onPageChange: () => {}
};
AtPagination.propTypes = {
current: PropTypes.number,
total: PropTypes.number,
pageSize: PropTypes.number,
icon: PropTypes.bool,
pickerSelect: PropTypes.bool,
customStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.string]),
onPageChange: PropTypes.func
};