UNPKG

zent

Version:

一套前端设计语言和基于React的实现

136 lines (120 loc) 3.74 kB
import React, { PropTypes, Component } from 'react'; import CorePagination from './modules/CorePagination'; import Prefix from './modules/Prefix'; import isEqual from 'zent-utils/lodash/isEqual'; const { number, func, string, oneOfType } = PropTypes; export default class Pagination extends Component { static propTypes = { className: string, prefix: string, current: number, totalItem: number, maxPageToShow: oneOfType([number, null]), pageSize(conf) { let { pageSize } = conf; if (typeof pageSize === 'number') { if (pageSize < 0) { return new Error('pageSize必须大等于0'); } } else if (Array.isArray(pageSize)) { let isAllNumber; if (pageSize.length === 0) { return new Error('pageSize的长度必须大于0'); } isAllNumber = pageSize.every((item) => { return (typeof item === 'number' || typeof item === 'object'); }); if (!isAllNumber) { return new Error('pageSize每一项必须是数字或对象'); } } else { return new Error('pageSize只能是数字或数组'); } }, onChange: func }; static defaultProps = { prefix: 'zent', pageSize: 10, className: '' }; // 为了能本地动态修改每页个数,得自己缓存pageSize了 state = { currentPageSize: this.getCurrentPageSize(this.parsePageSize(this.props.pageSize)) }; setPageSize = (num) => { this.setState({ currentPageSize: parseInt(num, 10) }); }; /** * [getCurrentPageSize description] * @method getCurrentPageSize * @param {[Array]} ps [从parsePageSize返回的标准数组] * @return {[Number]} [返回currentPageSize的数字值] */ getCurrentPageSize(ps) { for (let i = 0, len = ps.length; i < len; i++) { if (ps[i].isCurrent) { return ps[i].value; } } throw new Error(`pageSize 数据有错误 ${ps}`); } parsePageSize(pageSize) { let ps; if (typeof pageSize === 'number') { ps = [{ value: pageSize, isCurrent: true }]; } else { let hasCurrent; ps = pageSize.map((item) => { let tmp; if (typeof item === 'number') { tmp = { value: item }; } else { tmp = item; if (tmp.isCurrent) { hasCurrent = true; } } return tmp; }); if (!hasCurrent) { ps[0].isCurrent = true; } } return ps; } componentWillReceiveProps(nextProps) { if (!isEqual(this.props.pageSize, nextProps.pageSize)) { let pageSize = this.parsePageSize(nextProps.pageSize); let currentPageSize = this.getCurrentPageSize(pageSize); this.setState({ currentPageSize }); } } render() { // 如果传入的current小于1则进行修改 let { totalItem, current, pageSize, maxPageToShow } = this.props; pageSize = this.parsePageSize(pageSize); let { currentPageSize } = this.state; let totalPage = Math.ceil(totalItem / currentPageSize); current = current > 1 ? current : 1; // 最小值限定 current = current > totalPage ? totalPage : current; // 最大值限定 return ( <div className={`${this.props.prefix}-pagination ${this.props.className}`}> <Prefix pageSize={pageSize} currentPageSize={currentPageSize} totalItem={totalItem} setPageSize={this.setPageSize} /> { totalPage > 1 && <CorePagination maxPageToShow={maxPageToShow} current={current} total={totalPage} onChange={this.props.onChange || function () {}} /> } </div> ); } }