Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Meteor 1.6.x + Ant Design Table + recompose 实现数据分页效果

Meteor 1.6.x + Ant Design Table + recompose 实现数据分页效果

作者头像
我与梦想有个约会
发布于 2023-10-21 07:01:31
发布于 2023-10-21 07:01:31
39900
代码可运行
举报
文章被收录于专栏:jiajia_dengjiajia_deng
运行总次数:0
代码可运行

本文介绍了基于 Meteor 1.6.x + Ant Design Table + recompose + react-router-dom v4 实现分页的整个流程,从项目创建到最终实现完分页效果每个步骤都非常详细,同时也提供了 git 提交记录,用来让大家学习和分析每一步代码的变化。项目地址:https://github.com/nmgwddj/meteor-pagination

最终效果

创建项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ meteor create --full meteor-pagination
Created a new Meteor app in 'meteor-pagination'.

To run your new app:
  cd meteor-pagination
  meteor

If you are new to Meteor, try some of the learning resources here:
  https://www.meteor.com/tutorials

为了保守起见我们初始化以下 git 仓库,commit 一次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ cd meteor-pagination
~ git init

整理项目目录

默认创建的项目不是 react 结构的,我们需要删除掉无用的文件,并修改一下项目,使其支持 react,参考 Meteor 官方 React 教程 首先执行如下命令,安装 react 和 react-dom 组件,你也可以使用 npm 来安装 package,我比较习惯用 yarn。安装完成后删除无用的文件,见此次提交

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add react react-dom --save

创建 Layout

虽然是个很简洁的项目,但我还是想把创建的整个步骤跟大家描述清楚,避免初学者在学习的过程中遇到各种各样的问题。所以我也会写清楚创建 Layout 和 Router 的过程。 Layout 我们使用 ant design 的组件来实现,所以首先我们要引入 antdreact-router-dom,并在 .meteor/packages 文件中删除项目自带的 kadira:flow-router。避免与 react-router-dom 引起冲突。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add antd --save
yarn add react-router-dom --save

/imports/startup/client/index.js 中引入 antd 的 css 样式表,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react'
import { Meteor } from 'meteor/meteor'
import { render } from 'react-dom'

import App from '../../ui/pages/App'

import 'antd/dist/antd.css'

Meteor.startup(() => {
  render (
    <App />,
    document.getElementById('render-target')
  )
})

/imports/ui/layouts 目录下创建一个 index.js 文件,用来编写 Layout 的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react'
import Layout from 'antd/lib/layout'
import Menu from 'antd/lib/menu'
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'

import Home from '../components/Home'
import Links from '../components/Links'

const { Header, Content, Footer } = Layout

const MainLayout = () => {
  return (
    <Layout className='layout'>
      <Header>
        <div className='logo' />
        <Menu
          theme='dark'
          mode='horizontal'
          defaultSelectedKeys={['home']}
          style={{ lineHeight: '64px' }}
        >
          <Menu.Item key='home'><Link to='/'>Home</Link></Menu.Item>
          <Menu.Item key='links'><Link to='/links'>Links</Link></Menu.Item>
        </Menu>
      </Header>
      <Content style={{ padding: '50px 50px 0' }}>
        <div style={{ background: '#fff', padding: 24, minHeight: 280 }}>
          <Route exact path='/' render={({ match }) => <Home />} />
          <Route path='/links' render={({ match }) => <Links />} />
        </div>
      </Content>
      <Footer style={{ textAlign: 'center' }}>
        Ant Design ©2016 Created by Ant UED
      </Footer>
    </Layout>
  )
}

export default MainLayout

修改 /imports/ui/pages/App.js 代码,引入 react-router,并导入了 MainLayout 这个 Layout。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react'
import { BrowserRouter as Router, Route } from 'react-router-dom'

import MainLayout from '../layouts'

const App = () =>
  <Router>
    <Route path='/' component={MainLayout} />
  </Router>

export default App

在 MainLayout 中,我们引入了两个组件,一个是 Home,一个是 Links,所以我们还要在 /imports/ui/components/ 下创建 Home.js 和 Links.js,两个文件分别实现为一个简单的组件,然后我们提交一下,见本次提交

订阅数据显示表格

Layout 和 Router 都完成了,接下来我们就在 Links 组件中添加一个表格,用来显示项目默认创建时给生成的 links 数据。首先添加订阅数据所需要的包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
meteor add react-meteor-data

然后修改 /imports/ui/components/Links.js 文件,添加 ant design 的 Table 组件并订阅 links collection 数据,这里要注意,我们把组件名由 Links 修改为 LinksTable,避免和导入的 Links collection 名字冲突。代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react'
import Table from 'antd/lib/table'
import { withTracker } from 'meteor/react-meteor-data'

import { dateToString } from '../../lib/helpers'
import { Links } from '../../api/links/links'

const { Column } = Table

const LinksTable = ({ dataSource, isReady }) => {
  return (
    <Table dataSource={dataSource} loading={!isReady}>
      <Column
        title='Title'
        key='title'
        dataIndex='title'
      />
      <Column
        title='URL'
        key='url'
        dataIndex='url'
        render={(t, r) => <a href={t} target='_blank'>{t}</a>}
      />
      <Column
        title='CreatedAt'
        key='createdAt'
        dataIndex='createdAt'
        render={(t, r) => dateToString(t)}
      />
    </Table>
  )
}

export default withTracker(() => {
  // 订阅数据
  const linksHandle = Meteor.subscribe('links.all')
  const links = Links.find({}).fetch()
  const dataSource = []

  // 遍历数据,增加 key 用于表格显示
  if (Array.isArray(links)) {
    links.map(link => {
      dataSource.push({
        key: link._id,
        ...link
      })
    })
  }  

  return {
    isReady: linksHandle.ready(),
    dataSource
  }
})(LinksTable)

组件中使用了一个方法是 dateToString,用来转换日期,所以我们在项目 /imports 目录下我们新建了一个 lib 目录,存放了一个 helpers 文件,用来放一些常用的方法,因为使用到了 moment,所以我们要添加一下 moment。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add mement --save

修改完成后,展示的效果如下:

增加数据量

上面我们已经成功显示了所有 links 中的数据,但是数据量有点小,不方便我们测试分页效果,所以修改一下 /imports/startup/server/fixtures.js 的代码,让程序初始化的时候就默认生成 500 条数据,方便我们调试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Fill the DB with example data on startup

import { Meteor } from 'meteor/meteor'
import { Links } from '../../api/links/links.js'

Meteor.startup(() => {
  // if the Links collection is empty
  Links.remove({})
  for (let i = 0; i < 500; i++) {
    Links.insert({
      title: `Link title (${i})`,
      url: `https://www${i}.google.hk.com/`,
      createdAt: new Date()
    })
  }
})

实现按页数订阅数据

在实现分页之前,我们首先要修改一下 publish 的方法,增加一个 currentPage 参数和一个 pageSize 参数,用来在发布数据的时候,制定发布的数据量和数据段。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Meteor.publish('links.all', function (currentPage = 1, pageSize = 10) {
  return Links.find({}, {
    limit: pageSize,                    // 订阅默认的 10 条数据
    skip: (currentPage - 1) * pageSize  // 跳过当前页-1 * 每页数据的数据量,与传统分页没有什么区别
  })
});

然后就是前端的修改了,首先我们要给 Table 设置一个分页器(默认是有的,但是我们要个性化一下),如下图:

我们个性化了 Table 的分页功能,指定了默认的数据总数、当前页和点击分页按钮时触发的回调函数。这里大家可能看到多出来三个数据,分别是 linksCountcurrentPagesetCurrentPage。这三个数据哪里来的呢?分别起到什么作用呢? 其实他们是我们自己创建的状态,用来记录数据的总数和当前页以及一个设置当前页的函数方法,这些是由一个叫做 recompose 的包创建的,添加 recompose 包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add recompose --save

然后创建两个状态,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const enhance = compose(
  withState('currentPage', 'setCurrentPage', 1),
  withState('linksCount', 'setLinksCount', 0)
)

withState 的第一个参数是状态的名字,第二个参数是设置状态的函数名字,第三个方法是状态的初始值。随后我们将两个状态绑定到组件,这样我们就可以在组件中使用这两个状态并且可以调用两个修改状态的方法来修改状态。其实所谓的绑定就是用我们创建好的 enhance 包裹了一下之前写好的 withTracker。:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default enhance(
  withTracker(({ currentPage, setLinksCount }) => {
    // 订阅数据
    const linksHandle = Meteor.subscribe('links.all', currentPage)
    const links = Links.find({}).fetch()
    const dataSource = []
    Meteor.call('links.count', (err, result) => {
      if (!err) {
        // 设置数据总量
        setLinksCount(result)
      } else {
        console.log(err.message)
      }
    })

    // 用于调试,查看订阅了多少数据
    if (Array.isArray(links) && links.length !== 0) {
      console.log(links)
    }

    // 遍历数据,增加 key 用于表格显示
    if (Array.isArray(links)) {
      links.map(link => {
        dataSource.push({
          key: link._id,
          ...link
        })
      })
    }

    return {
      isReady: linksHandle.ready(),
      dataSource
    }
  })(LinksTable)
)

此时 withTracker 的 props 就增加了两个状态和两个修改状态的方法,我们可以通过 props 把他们导出来使用。可以看到 withTracker 函数中已经有了变化,我们增加了一个 meteor.call,来从服务端获取数据的总数。因为这里我们仅需要一个当前页,用来订阅数据,还需要一个修改数据总数的方法 setLinksCount 用来 meteor.call 返回后设置数据总数(获取到数据总数后传递给表格 pagination 做参数,可以让分页器显示一共有多少页)。服务端实现的获取总数的方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'links.count' () {
  return Links.find().count()
}

这样我们就把整个流程串了起来,首先创建了两个状态,分别是当前页和数据总数,分别传递给组件用于显示当前在第几页和 withTracker 来订阅数据。withTracker 中还使用了 setLinksCount 方法来设置数据总数的状态,让 Table 表格可以看到分页器下面所有页数的按钮(如果不这样做只能看到第一页的按钮),最后在点击分页器第几页按钮时出发 onChange 调用了 setCurrentPage 来设置 currentPage 的数据,此时 currentPage 变化,withTracker 也收到变化通知,会重新到后台订阅数据,重新订阅后,数据发生改变,表格的数据也随之改变。这里是最后一次提交。 以上就是整个分页的流程,如果有不明白的地方,欢迎大家一起讨论。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Layout布局实现一个简单的react管理后台
今天下班之后把antd大致过了一遍,不得不说,还是挺好用的,前面对于react的知识点,该学习的也在慢慢的学习了,学完之后,打算做一个博客管理系统的后台。这里记录的就是大致的步骤。
王小婷
2019/11/27
2.9K1
Ant Design学习(四)
使用Menu组件作为导航条:https://ant.design/components/menu-cn/
用户1289394
2023/01/05
7480
Ant Design学习(四)
React实战:使用Vite+TS+Antd构建React项目
由于我之前学过React框架,但是由于工作中没有使用它,所以我最近开始使用了Vite、TypeScript、React Router,Redux,Axios,Ant Design和SpringBoot等流行技术来搭建了一个博客项目来巩固我的学习成果。这个项目包括了博客文章列表、文章详情、标签分类、搜索功能等常用功能。通过这个项目,我将分享如何使用Vite、TypeScript、React Router和Ant Design来搭建一个博客项目,并不断分享我所遇到的问题,以及如何解决它。希望我的实战可以帮助您更好地了解React生态系统,并且能够帮助您更加高效地开发React应用程序。
Front_Yue
2024/01/03
3.4K0
React实战:使用Vite+TS+Antd构建React项目
快速学习Ant Design-布局
antd布局:https://ant.design/components/layout-cn/ 在后台系统页面布局中,往往是经典的三部分布局,像这样:
cwl_java
2020/02/14
3.3K0
【React】:路由(Routing)
Vue 路由库:Vue Router https://router.vuejs.org/zh/ iview-admin 对路由的管理: https://lison16.github.io/iview-admin-doc/#/%E8%B7%AF%E7%94%B1%E9%85%8D%E7%BD%AE
WEBJ2EE
2020/05/09
1.4K0
【React】:路由(Routing)
React进阶篇(九)React Router
单页面应用(SPA)可以让Web应用看起来像多页面应用,URL变化时,不会向服务端发起请求,而是利用自身监听路由变化而更新UI。 通过使用React Router可以让Web应用根据不同URL渲染不同组件。
娜姐
2020/12/11
3.1K0
React权限管理分享
前端权限,主要是两部分:一是控制显示,没有对应权限不进行显示,二是拦截非法的请求,下文介绍了在React中去做前端权限的步骤与代码:
用户9914333
2022/07/21
9650
React权限管理分享
React 动态菜单-不限级递归菜单树
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159442.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/17
1.7K0
Ant Design
提交表单可以直接用回调函数里面的values获取值 重置表单数据 form.resetFields()
P轴
2022/11/18
2.9K0
Ant Design
使用ant design开发完整的后台系统
这里要说的是ant design的vue版和react版本的使用。这里不考虑到两种框架vue和react的底层。
Jimmy_is_jimmy
2020/06/09
2.6K0
使用ant design开发完整的后台系统
Hooks + TS 搭建一个任务管理系统(五)-- 路由跳转页面
在上一篇文章中我们已经写完了首页项目列表的展示部分,利用了大量的 custom hook 来处理对 url 进行操作,实现了将 query 映射到 url 的操作,同时利用 react-query 中的 useMutation 搭配实现了乐观更新的效果,同时利用 useDebounce 来减少请求,优化性能
小丞同学
2021/10/29
8210
Hooks + TS 搭建一个任务管理系统(五)-- 路由跳转页面
React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
上个版本 :React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏
CRPER
2018/08/28
3.9K0
React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
Ant Design Vue使用记录,持续记录
官方文档:https://antdv.com/components/table-cn/#API
房东的狗丶
2023/02/17
5.3K0
React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏
前言 动态tab水平菜单,这个需求很常见,特别是对于后台管理系统来说; 因为当我们侧边栏层级多了,你要找到一个子菜单,必须找,展开,点击. 而有了这个,我们就能节省不少时间,体验上来说也会改善不少 实
CRPER
2018/08/28
3.3K0
React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏
Hooks + TS 搭建一个任务管理系统(二)-- 项目列表展示
在我们写好登录注册界面后,我们需要开始解决登录后的项目列表展示页,这也是我们在自动登录后显示的页面
小丞同学
2021/10/22
8160
快速学习Ant Design-表格
参考官方文档进行实现:https://ant.design/components/table-cn/ 改造UserList.js页面:
cwl_java
2020/02/14
6190
React后台管理前端系统(基于开源框架开发)起步式
这个系统的搭建背景是这样的,有一个朋友想看到现有系统中的一些,用户数据,新闻数据,只需要看到,短期不需要增删改功能,让我搭建一个简单的后台系统给他看.接到任务作为一个有四年开发经验的人来说这也太简单了吧,开始干吧,最简单的办法是直接使用开源项目https://github.com/PanJiaChen/vue-element-admin 下载下来,把不要的路由去掉,新建几个表格路由,页面直接复制过来就用了.
拿我格子衫来
2022/01/24
2K0
React后台管理前端系统(基于开源框架开发)起步式
ReactAdminArco自创react18+arco后台前端项目框架管理系统
整个项目采用vite4构建工具创建,遵循标准的react18 hooks编码方式开发页面。
andy2018
2023/10/18
1.1K3
React实现分页器效果
世间万物皆对象
2024/03/20
2000
SpringBoot + Vue + ElementUI 实现 el-table 分页功能详解
在现代Web应用程序开发中,前后端分离架构越来越受欢迎。这种架构使得前端和后端开发可以并行进行,提高了开发效率。本文将详细讲解如何使用SpringBoot作为后端,Vue.js和ElementUI作为前端,实现一个带分页功能的数据表格(el-table)。分页功能在处理大量数据时必不可少,可以有效提升用户体验和系统性能。
繁依Fanyi
2024/08/06
2920
推荐阅读
相关推荐
Layout布局实现一个简单的react管理后台
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档