react-virtualized 组件本身没有提供分页器功能,见这个issue:https://github.com/bvaughn/react-virtualized/issues/24

如果想给react-virtualized实现的表格添加分页器功能,需要自己手动实现一个分页器,网上有一个参考代码:

https://codesandbox.io/s/mm3kvjo0z9

分页器代码:

Paginator.js

import React from 'react'
import { Button } from 'semantic-ui-react' const BetweenButton = () => <Button content='...' style={{ cursor: 'default' }} /> const Paginator = ({ currentPage, onPageChange, range = 3, pageCount }) => {
const renderedPages = [...Array(range * 2 + 1).keys()]
.map(i => currentPage - range + i)
.filter(i => i > 0 && i <= pageCount) const showStart = currentPage - range > 1
const showEnd = currentPage + range < pageCount return (
<Button.Group compact>
{showStart && (
[
<Button content={1} onClick={() => onPageChange(1)} />,
<BetweenButton />
]
)}
{renderedPages.map(page => (
<Button
key={page}
onClick={() => onPageChange(page)}
content={page}
primary={currentPage === page}
/>
))}
{showEnd && (
[
<BetweenButton />,
<Button content={pageCount} onClick={() => onPageChange(pageCount)} />
]
)}
</Button.Group>
)
} export default Paginator

使用该分页器:

index.js

import React, { Component } from 'react'
import { render } from 'react-dom'
import { Icon, Header, Button } from 'semantic-ui-react'
import { Column } from 'react-virtualized'
import styled from 'styled-components' import VirtualizedTable from './VirtualizedTable'
import Paginator from './Paginator'
import { getRows } from './utils' const count = 100000
const rows = getRows(count) const Wrapper = styled.div`
margin: 10px;
` const CountCell = ({ cellData }) => (
<div>
<Icon name='mail' color='green' />{cellData}
</div>
) class App extends Component {
constructor() {
super()
this.state = {
page: 1,
perPage: 18,
scrollToIndex: undefined
}
this.handleRowsScroll = this.handleRowsScroll.bind(this)
this.handlePageChange = this.handlePageChange.bind(this)
} handleRowsScroll({ stopIndex }) {
this.setState(prevState => {
const page = Math.ceil(stopIndex / prevState.perPage)
return { page, scrollToIndex: undefined }
})
} handlePageChange(page) {
this.setState(prevState => {
const scrollToIndex = (page - 1) * prevState.perPage
return { page, scrollToIndex }
})
} render() {
const { page, perPage, scrollToIndex } = this.state const headerHeight = 30
const rowHeight = 40
const height = rowHeight * perPage + headerHeight
const rowCount = rows.length
const pageCount = Math.ceil(rowCount / perPage) return (
<Wrapper>
<Header as='h1'>React virtualized table with pagination</Header>
<p>
<Paginator
pageCount={pageCount}
currentPage={page}
onPageChange={this.handlePageChange}
/>
</p>
<VirtualizedTable
rowHeight={rowHeight}
headerHeight={headerHeight}
height={height}
rowCount={rowCount}
rows={rows}
onRowsRendered={this.handleRowsScroll}
scrollToIndex={scrollToIndex}
scrollToAlignment='start'
>
<Column label='Id' dataKey='id' width={100} />
<Column label='Name' dataKey='name' width={250} />
<Column label='Count' dataKey='count' width={100} cellRenderer={CountCell} />
</VirtualizedTable>
</Wrapper>
)
}
} render(<App />, document.getElementById('root'));

这个分页器没有设置一页多少行的功能,也没有直接跳转到多少行的功能,我给它加了这两个功能:

在index.js中加入如下代码:

使用了两个input受控组件,关于受控组件:https://segmentfault.com/a/1190000012404114

          <Paginator pageCount={pageCount} currentPage={currentPage} onPageChange={this.handlePageChange} />

          <input type="number" min="1" max="100" value={this.state.perPage} onChange={(e) => {
if(e.target.value>=1&&e.target.value<=100){
this.setState({perPage: e.target.value, currentPage:1,});
}else{
alert('the rows on a page should between 1 and 100');
}
}} /> rows on a page; jump to page
<input type="number" min="1" value={this.state.currentPage} onChange={(e)=>{
if(e.target.value>=1 && e.target.value<=pageCount){
this.setState({currentPage:e.target.value});
}else{
alert('the page number should exist!')
}
}}/>

【react 分页器】 基于react-virtualized组件的分页器的更多相关文章

  1. react应用(基于react脚手架)

    使用create-react-app创建react应用 react脚手架 1) xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 a. 包含了所有需要的配置 b. 指定好了所有的依赖 ...

  2. RSuite 一个基于 React.js 的 Web 组件库

    RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...

  3. 基于React Native的Material Design风格的组件库 MRN

    基于React Native的Material Design风格的组件库.(为了平台统一体验,目前只打算支持安卓) 官方网站 http://mrn.js.org/ Github https://git ...

  4. 基于 React 实现一个 Transition 过渡动画组件

    过渡动画使 UI 更富有表现力并且易于使用.如何使用 React 快速的实现一个 Transition 过渡动画组件? 基本实现 实现一个基础的 CSS 过渡动画组件,通过切换 CSS 样式实现简单的 ...

  5. 基于 react 的Java web 应用—— 组件复用(后续需更新)

    前言 实习第二周,被告知要用React与导师进行基于React的Javaweb 的开发,jinzhangaaaaa~由于React 这款框架没学过,看了一峰老师的基础入门教程,硬着头皮开始上了... ...

  6. 基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中。

    react-amap 这是一个基于 React 封装的高德地图组件,帮助你轻松的接入地图到 React 项目中. 文档实例预览: Github Web | Gitee Web 特性 ️ 自动加载高德地 ...

  7. 基于React.js网页版弹窗|react pc端自定义对话框组件RLayer

    基于React.js实现PC桌面端自定义弹窗组件RLayer. 前几天有分享一个Vue网页版弹框组件,今天分享一个最新开发的React PC桌面端自定义对话框组件. RLayer 一款基于react. ...

  8. 基于react hooks,zarm组件库配置开发h5表单页面

    最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...

  9. 如何基于 React 封装一个组件

    如何基于 React 封装一个组件 前言 很多小伙伴在第一次尝试封装组件时会和我一样碰到许多问题,比如人家的组件会有 color 属性,我们在使用组件时传入组件文档中说明的属性值如 primary , ...

随机推荐

  1. PHP学习记录第一篇:Ubuntu14.04下LAMP环境的搭建

    最近一段时间会学习一下PHP全栈开发,将会写一系列的文章来总结学习的过程,以自勉. 第一篇记录一下LAMP环境的安装 0. 安装Apache Web服务器 安装之前先更新一下系统 sudo apt-g ...

  2. HDU 2110 Crisis of HDU

    Crisis of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. flume+kafka

    这里演示在单机fulume环境下,kafka作为source ,chanel , sink时三种情况 下面的测试都是基于下面的基本的配置文件进行修改的 a1.sources = r1 a1.sinks ...

  4. 计算机网络——OSI、TCP/IP协议族详解

    一.OSI七层协议体系结构域TCP/IP四层体系结构对比 ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是 ...

  5. Android——gridLayout(网格布局)

    <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...

  6. 杂文 - 设计MIUI主题 的 MIUI设计师

    设计MIUI主题 的 MIUI设计师 本文地址: http://blog.csdn.net/caroline_wendy 时间: 2014.6.10 By Spike. 1. 首先注冊MIUI设计师: ...

  7. 百家搜索:在站点中加入Google、百度等搜索引擎

    来源:http://www.ido321.com/1143.html 看到一些站点上加入了各种搜索引擎. 如Google.百度.360.有道等.就有点好奇.这个怎么实现?研究了一各个搜索引擎怎么传送k ...

  8. PHPMailer发送邮箱(ThinkPHP实战篇)

    1.下载phpmailer文件库 2.引用文件,此处将代码放到 :函数库中,function.php function sendConsultantMessage($sendData){ Vendor ...

  9. 响应式布局中为什么要使用em设置字体大小而不用px

    px像素(Pixel).相对长度单位.像素px是相对于不同设备显示器屏幕分辨率(pad/phone/pc)而言的.(引自CSS2.0手册) 1em指的是一个字体的大小,它会继承父级元素的字体大小,因此 ...

  10. 系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体

    系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体 1,设计实体/表 设计实体 --> JavaBean --> hbm.xml --> 建表 设计Role实体 p ...