import React,{ Component } from 'react'; import PageComponent from './pageComponent.jsx'; import Mock from 'mockjs'; import MockApi from '../util/mockApi.js'; class Pagination extends Component{ constructor(props){ super(props); this.state = { indexList : [],//获取数据的存放数组 totalNum:'',//总记录数 totalData:{},current: 1,//当前页码 pageSize:5,//每页显示的条数5条 goValue:'',totalPage:'',//总页数 } } componentWillMount(){ var _this = this;//如果不定义就会出现作用域的问题this.setState不是一个函数 //使用mock模拟数据 $.ajax({ url:MockApi.getIndexList()+/\/\.json/,dataType:'json',}).done(function(data){ _this.setState({totalData:data}) _this.setState({totalNum:data.array.length}) //计算总页数= 总记录数 / 每页显示的条数 let totalPage =Math.ceil( _this.state.totalNum / _this.state.pageSize); _this.setState({totalPage:totalPage}) _this.pageClick(1); }) } //点击翻页 pageClick(pageNum){ let _this = this; if(pageNum != _this.state.current){ _this.state.current = pageNum } _this.state.indexList=[];//清空之前的数据 for(var i = (pageNum - 1) * _this.state.pageSize; i< _this.state.pageSize * pageNum; i++){ if(_this.state.totalData.array[i]){ _this.state.indexList.push(_this.state.totalData.array[i]) } } _this.setState({indexList:_this.state.indexList}) //console.log(_this.state.indexList) } //下一步 goNext(){ var _this = this; let cur = _this.state.current; //alert(cur+"==="+_this.state.totalPage) if(cur < _this.state.totalPage){ _this.pageClick(cur + 1); }} //跳转到指定页 goSwitchChange(e){ var _this= this; _this.setState({goValue : e.target.value}) var value = e.target.value; //alert(value+"==="+_this.state.totalPage) if(!/^[1-9]\d*$/.test(value)){ alert('页码只能输入大于1的正整数'); }else if(parseInt(value) > parseInt(_this.state.totalPage)){ alert('没有这么多页'); }else{ _this.pageClick(value); }} render(){ return( <div> <table class="table table-bordered"> <thead> <tr> <th>语文</th> <th>数学</th> <th>英语</th> </tr> </thead> <tbody> { this.state.indexList.map(function(data){ return( <tr> <td>{data.scoreChinese}</td> <td>{data.scoreMath}</td> <td>{data.scoreEnglish}</td> </tr> ) }) } </tbody> </table> <PageComponent total={this.state.totalNum} current={this.state.current} totalPage={this.state.totalPage} goValue={this.state.goValue} pageClick={this.pageClick.bind(this)} goPrev={this.goPrevClick.bind(this)} goNext={this.goNext.bind(this)} switchChange={this.goSwitchChange.bind(this)}/> </div> )} } export default Pagination@H_403_0@子组件pageComponent.jsx
import React,{ Component } from 'react'; class PageComponent extends Component{ render(){ let _this = this; //当前页码 let cur = this.props.current; //显示分页按钮 let pageNum = []; let begin; let len; if(_this.props.totalPage > 5){ len = 5; if(cur >= (_this.props.totalPage-2)){ begin = _this.props.totalPage - 4; }else if(cur <= 3){ begin = 1; }else{ begin = cur - 2; } }else{ len = _this.props.totalPage; begin = 1; } //根据返回的总记录数计算当前页显示的数据 for(let i = 0; i < len; i ++){ let cur = this.props.current; let showI = begin + i; if(cur == showI){ pageNum.push({num : showI,cur : true}); }else{ pageNum.push({num : showI,cur : false}); } } return( <div> <div className="paginationDiv"> <a className={this.props.current == 1? 'prev disable' : 'prev'} onClick={this.props.goPrev.bind(this)}></a> <span> { pageNum.map(function(curPageNum){ return(<a onClick = {_this.props.pageClick.bind(_this,curPageNum.num)} className={curPageNum.cur ? 'num current' : 'num'}>{curPageNum.num}</a>) }) } </span> <a className={this.props.current == this.props.total? 'next disable' : 'next'} onClick={this.props.goNext.bind(this)}></a> <div className="rightDiv"> 总共<span className="num-total">{_this.props.total}</span>条, 共 <span className="num-total"> {_this.props.totalPage}</span>页,到第 <input type="text" value={_this.props.goValue} onChange= {this.props.switchChange.bind(this)} />页 </div> </div> </div> ) } } export default PageComponent@H_403_0@mock模拟的数据mockApi.js
import Mock from 'mockjs'; //首页自定义数据接口 采用array的方式 module.exports = { getIndexList(){ var template ={ "array|1-20":[ { 'scoreChinese|+1':[ '70' ],'scoreMath|+1':[ '90' ],'scoreEnglish|+1':[ '80' ] } ] } Mock.mock(/\.json/,template) } }@H_403_0@分页效果显示:
@H_403_0@详细Demo下载地址: