分页查询 前后端代码

本文探讨了在前端使用Ant Design和React进行开发时,如何通过分页查询优化数据展示,避免一次性加载大量数据。后端采用Koa框架配合SQLite,通过limit和count实现智能分页。遇到的问题和解决方案也进行了分享。

需求分析:
用表格展示数据,当数据过大时,从时间和缓存上考虑,一次返回全部数据是不可取的。于是使用分页查询。
前端每次点击切换页面的时候,带着当前页面参数向后端发请求,后端查询时用limit,只返回当前页面的数据,同时后端需返回一个count值计算所有要展示的数据量,供前端可展示页数(否则就只有一页)。
前端react、antd,后端koa、sqlite。

前端代码:
首先在组件pagination内设置翻页回调函数,写在属性onChange里,该函数可以拿到当前页面和页面条数,带上这些参数向后端发请求。
同时组件内要设置total,表示总条数,这样才可以显示正确的分页栏。

 <Table
              expandIcon={null}
              expandedRowRender={record => expandedRowRender(record)}
              expandedRowKeys={expendedKey}
              rowKey={record => record.id}
              columns={columns}
              dataSource={records}
              style={{ backgroundColor: '#fff', marginTop: 16 }}
              onChange={CChange}
              pagination={{ onChange: PageChange, total: pageCount, current: currentPage }}
/>
    const PageChange = (page, pageSize) => {
      currentPage = page;
      if (searchData.search) {
        actions.fetchRecords(searchData, page, pageSize);
        currentPage = 1;
      } else {
        actions.fetchRecords({}, page, pageSize);
      }
    };

踩坑:
可以看到我还有一个current属性,这个代表当前页面。之前我出现了一个bug,如果当前在第二页,点击搜索会返回正确的搜索信息,但分页栏的页面显示得还是第二页,正确来说应该要回到第一页。
于是我搜索antd的文档,发现其有一个current属性,我们在翻页和搜索的时候手动指定即可正确表示页面。

后端代码:
后端代码没啥可说的,就是拿到参数,查询的时候用上limit即可。
controller.js

export const getRecord = async (request, reply) => {
  console.log(request.query);
  const {
    match, search, page, pageSize,
  } = request.query;
  let ans;
  let condition;
  if (!match || !search) { // 返回全部记录
    ans = await getAllRecords(page, pageSize);
  } else { //  返回搜索记录
    if (match === 'exact') {
      condition = search;
    } else {
      condition = `%${search}%`;
    }
    ans = await getRecordsByCondition(condition, page, pageSize);
  }
  return reply(ans).code(200);
};

orm.js

export const getAllRecords = async (page, pageSize) => {
  const sqlAllRecords = `
  ${sqlCommon}
  order by createtime desc limit ${(page - 1) * pageSize},${pageSize};
  `;
  const sqlPageCount = `
  select count(*) as count from (${sqlCommon})
  `;
  const records = await sequelize.query(sqlAllRecords, { raw: true });
  const pageCount = await sequelize.query(sqlPageCount, { raw: true });
  console.log(pageCount[0][0].count);
  const ans = {
    records: records[0],
    pageCount: pageCount[0][0].count,
  };
  return ans;
};

运行截图没什么特别的,就不放了。

以下是一个简单的Spring Boot分页查询前后端代码示例。 后端代码: ```java @RestController @RequestMapping("/api") public class UserController { @Autowired private UserService userService; @GetMapping("/users") public ResponseEntity<Page<User>> getUsers(@RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size) { Page<User> users = userService.getUsers(PageRequest.of(page, size)); return ResponseEntity.ok(users); } } ``` 在上面的代码中,我们使用`@GetMapping`注释处理HTTP GET请求。`@RequestParam`注释用于指定查询参数“page“size”。`PageRequest`用于创建一个分页请求对象,该对象包含要请求的页面每个页面的大小。最后,我们将`Page<User>`返回给客户端。 前端代码: ```javascript function getUsers(page, size) { $.ajax({ url: "/api/users?page=" + page + "&size=" + size, type: "GET", success: function (data) { // 处理返回的数据 console.log(data); }, error: function (xhr, status, error) { console.log(xhr); console.log(status); console.log(error); } }); } getUsers(0, 10); ``` 在上面的代码中,我们使用`$.ajax`函数向服务器发出HTTP GET请求。我们将查询参数“page“size”作为URL参数传递。在成功回调中,我们将响应数据打印到控制台上。在错误回调中,我们将错误信息打印到控制台上。 以上是一个简单的Spring Boot分页查询前后端代码示例。需要注意的是,实际应用中可能需要处理更多的参数复杂的查询条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值