常用知识碎片 分页组件的使用(arco-design组件库)

news2024/7/30 10:24:38

目录

分页组件使用

API

组件代码示例

使用思路:

前端示例代码

html

 script

后端示例代码

Controller

Impl

xml

总结


分页组件使用

使用Arco Design之前需要配置好搭建前端环境可以看我另外一篇文章:

手把手教你 创建Vue项目并引入Arco Design组件库

Arco Design Vue - <a-pagination> API 详细的可以可以点击此网站查看具体用法

查看源代码

API

组件代码示例

本代码是一个小项目的示例

使用思路:

  1. 首先获取好总的条数 也就是实例代码中的 --- :total="total",对total进行属性绑定
  2. 其次获取当前页数 --- :current="currentPage"
  3. 最后就是获取每页显示多少页 --- :page-size="pageSize"
  4. 还有就是创建页面改变触发的函数 --- @change="handleChange"

前端示例代码

省略了很多代码就放了关键的分页组件代码。

html

<template>
    <a-pagination @change="handleChange"
                    :total="total" :current="currentPage" :page-size="pageSize" show-total/>
</template>

 script

<script setup>
import {ref } from "vue";
import {useRouter} from 'vue-router'
import axios from "axios";
import {message} from "ant-design-vue";
import qs from "qs";

// 查询参数响应式变量
const searchParam = ref(
    {
      keyword: "",
      internshipMonthDuration: "",
      weekDay: "",
      educationalRequirements: "",
      employmentOpportunities: "",
      corporateLevel: "",
    }
)

const items = ref([])
//定义变量保存分页器的当前页数
let currentPage = ref(1);
//定义变量保存分页器的每页显示多少条 这里我设置了一个每页显示8条 
let pageSize = ref(8); 
//定义变量保存数据总条目数
let total = ref();
        
// 根据条件从后端获取数据总条数
const getRecordCount = () => {
  // 使用qs.stringify() 是将js对象转换为字符串
  let data = qs.stringify(searchParam.value);
  axios.get('http://localhost:8080/v1/Psearch/selectRecordCount?' + data).then((res) => {
    if (res.data.code === 2000) {
      console.log("查询的条数为 == " + res.data.data)
      total.value = res.data.data;
    } else {
      message.error("加载失败" + res.data.msg)
    }
  });
}

// 加载数据
const loadData = () => {
  console.log("LoadData执行 当前查询条件searchParam.value === " + searchParam.value);
  getRecordCount();
  console.log("total === " + total.value)
  //定义变量保存分页器的当前页数 放入查询条件中
  searchParam.value.currentPage = currentPage.value;
  //定义变量保存分页器的每页显示多少条 放入查询条件中
  searchParam.value.pageSize = pageSize.value;
  let data = qs.stringify(searchParam.value)
  //分页条件查询
  axios.get('http://localhost:8080/v1/Psearch/selectAllRecords?' + data).then((res) => {
    if (res.data.code === 2000) {
      console.log("查询的记录为 == " + res.data.data)
      items.value = res.data.data;
      for (const element of items.value) {
        if (element.educationalRequirements === '10') {
          element.educationalRequirements = '大专';
        } else if (element.educationalRequirements === '20') {
          element.educationalRequirements = '本科';
        } else if (element.educationalRequirements === '30') {
          element.educationalRequirements = '研究生';
        }
      }
    } else {
      message.error("加载失败" + res.data.msg)
    }
  });
}


//页面变化更新数据 点击指定页码时,page是指代这个指定的页码
const handleChange = (page) => {
  //点击其他页时候更新当前页码
  currentPage.value = page;
}
</script>

注意!!!!!!

必须要加这个 handleChange(page) 函数,不然即时分页了,点击指定页码 不会跳转到指定页码

const handleChange = (page) => {

//点击其他页时候更新为点击的指定页码

currentPage.value = page;

}

不设置这个函数更新当前页码,点击了不会跳转到第二页

后端示例代码

Controller

@RestController
@RequestMapping("/v1/Psearch/")
@Slf4j
public class PracticeSearchController {

    @Autowired
    private PracticeSearchService practiceSearchService;
    @GetMapping("selectRecordCount")
    public JsonResult selectRecordCount(PracticeSearchRecordsParam practiceSearchRecordsParam){
        log.info("前端传入搜索参数:{}",practiceSearchRecordsParam);
        Integer count = practiceSearchService.selectRecordCount(practiceSearchRecordsParam);
        log.info("后端返回搜索记录的总条数为:{}",count);
        return JsonResult.ok(count);
    }
    @GetMapping("selectAllRecords")
    public JsonResult selectAllRecords(PracticeSearchListParam practiceSearchListParam){
        log.info("前端传入搜索参数:{}",practiceSearchListParam);
        List<PracticeSearchVO> recordsList = practiceSearchService.selectAllRecords(practiceSearchListParam);
        return JsonResult.ok(recordsList);
    }

}

Impl

@Slf4j
@Service
public class PracticeSearchServiceImpl implements PracticeSearchService {

    @Autowired
    private PracticeSearchMapper practiceSearchMapper;

    /**
     * 根据查询参数获取实践搜索记录的数量。
     *
     * @param param 实践搜索的参数对象,用于指定查询条件。
     * @return 返回实践搜索记录的总数。
     */
    @Override
    public Integer selectRecordCount(PracticeSearchRecordsParam param) {
        // 调用实践搜索Mapper接口,根据参数查询实践搜索记录的数量
        List<PracticeSearchVO> list = practiceSearchMapper.selectRecordCount(param);
        // 记录查询到的记录数,用于日志记录和问题排查
        log.info("查询记录数 === " + list.size());
        // 返回查询到的记录数
        return list.size();
    }

    /**
     * 根据实践搜索参数查询所有记录。
     *
     * @param practiceSearchListParam 实践搜索列表参数,包含分页和过滤条件。
     * @return 返回符合条件的实践搜索结果列表。
     */
    @Override
    public List<PracticeSearchVO> selectAllRecords(PracticeSearchListParam practiceSearchListParam) {
        // 获取分页大小
        Integer pageSize = practiceSearchListParam.getPageSize();
        // 获取当前页码
        Integer currentPage = practiceSearchListParam.getCurrentPage();
        // 计算数据库查询的起始位置,以实现分页查询 (前端传过来的页码是从第一页开始的所以currentPage要减 1,数据库分页是从第 0 页开始)
        currentPage = (currentPage - 1) * (pageSize - 1);
        // 更新当前页码,用于后续的分页处理
        practiceSearchListParam.setCurrentPage(currentPage);
        // 日志记录查询的分页信息
        log.info("pageSize === {} currentPage === {}", pageSize, currentPage);

        // 调用Mapper查询所有符合条件的记录
        List<PracticeSearchVO> list = practiceSearchMapper.selectAllRecords(practiceSearchListParam);
        // 日志记录查询结果
        log.info("查询到的所有记录 === {}", list);

        // 返回查询结果
        return list;
    }
}

xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tedu.search.mapper.PracticeSearchMapper">
    <select id="selectRecordCount" resultType="cn.tedu.search.pojo.vo.PracticeSearchVO">
        SELECT r.title_name,r.corporate_name,r.corporate_level,r.photo_show,
        p.salary,p.welfare,p.job_detail,p.educational_requirements,p.employment_opportunities,
        c.cover_photo,c.company_size
        FROM recruitment_information r
        INNER JOIN position_detail p ON r.id = p.recruitment_information_id
        INNER JOIN company c ON r.company_id = c.id
        WHERE p.job_type = '实习'
        <if test="keyword != null and keyword != ''">
            AND (
            r.title_name LIKE CONCAT('%', #{keyword}, '%')
            OR r.corporate_name LIKE CONCAT('%', #{keyword}, '%')
            OR p.job_detail LIKE CONCAT('%', #{keyword}, '%')
            )
        </if>

        <if test="internshipMonthDuration != null and internshipMonthDuration != ''">
            AND p.internship_month_duration = #{internshipMonthDuration}
        </if>
        <if test="educationalRequirements != null and educationalRequirements != ''">
            AND p.educational_requirements = #{educationalRequirements}
        </if>
        <if test="employmentOpportunities != null and employmentOpportunities != ''">
            AND p.employment_opportunities = #{employmentOpportunities}
        </if>
        <if test="corporateLevel != null and corporateLevel != ''">
            AND r.corporate_level = #{corporateLevel}
        </if>
        <if test="weekDay != null">
            AND p.week_day = #{weekDay}
        </if>
    </select>

    <select id="selectAllRecords" resultType="cn.tedu.search.pojo.vo.PracticeSearchVO">
        SELECT r.title_name,r.corporate_name,r.corporate_level,r.photo_show,
               p.salary,p.welfare,p.job_detail,p.educational_requirements,p.employment_opportunities
              ,c.cover_photo,c.company_size
        FROM recruitment_information r
        INNER JOIN position_detail p ON r.id = p.recruitment_information_id
        INNER JOIN company c ON r.company_id = c.id
        WHERE p.job_type = '实习'
        <if test="keyword != null and keyword != ''">
            AND (
            r.title_name LIKE CONCAT('%', #{keyword}, '%')
            OR r.corporate_name LIKE CONCAT('%', #{keyword}, '%')
            OR p.job_detail LIKE CONCAT('%', #{keyword}, '%')
            )
        </if>
        <if test="internshipMonthDuration != null and internshipMonthDuration != ''">
            AND p.internship_month_duration = #{internshipMonthDuration}
        </if>
        <if test="educationalRequirements != null and educationalRequirements != ''">
            AND p.educational_requirements = #{educationalRequirements}
        </if>
        <if test="employmentOpportunities != null and employmentOpportunities != ''">
            AND p.employment_opportunities = #{employmentOpportunities}
        </if>
        <if test="corporateLevel != null and corporateLevel != ''">
            AND r.corporate_level = #{corporateLevel}
        </if>
        <if test="weekDay != null">
            AND p.week_day = #{weekDay}
        </if>
            LIMIT #{currentPage},#{pageSize}
    </select>
</mapper>

注:

使用分页 SQL:

假设 每页显示10条数据

查询第一页的10条记录

select * user limit 0 10 (查询第1条到第10条)

or

select * user limit 10 (查询第1条到第10条)

查询第二页的10条记录

select * user limit 10 10 (查询第11条到第20条)

limit 后面两个参数的具体含义:

LIMIT #{currentPage},#{pageSize}


limit (当前页数)* 每页显示的条数(起始数据条数), 每页最大显示的记录数(从起始数据的下一条开始的偏移量)

在MyBatis中LIMIT之后的语句不允许的变量不允许进行算数运算,会报错。

如:

LIMIT (#{currentPage}-1)*#{pageSize},#{pageSize}; // 错误

LIMIT ${(currentPage-1)*pageSize},${pageSize}; (正确)

总结

  1. 确定好需要显示的条数(total)。
  2. 当前页数(currentPage),可以指定好默认是第0页,本文示例代码是从第1页开始
  3. 每页显示多少条记录(pageSize ) --- 一开始就要定义不然页面加载数据时候就要报错。
  4. 创建好页面变化时触发的函数 handleChange(),更新点击后的页码。

演示一下最终效果啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaWeb程序设计】Servlet(二)

目录 一、改进上一篇博客Servlet&#xff08;一&#xff09;的第一题 1. 运行截图 2. 建表 3. 实体类 4. JSP页面 4.1 login.jsp 4.2 loginSuccess.jsp 4.3 loginFail.jsp 5. mybatis-config.xml 6. 工具类&#xff1a;创建SqlSessionFactory实例&#xff0c;进行 My…

十八.升职加薪系列-JVM垃圾回收器-开天辟地的ZGC

前言 随着Java的发展&#xff0c;JVM的GC垃圾回收器也在跟着升级&#xff0c;从早起的单线程垃圾回收器Serial&#xff0c;到多线程的垃圾回收器Parallel Scavenge&#xff0c;再到并发垃圾回收器CMS,G1等。它们在某些对延迟要求比较高的系统来说都有些力不从心,比如&#xff…

物联网系统中市电电量计量方案(一)

为什么要进行电量计量&#xff1f; 节约资源&#xff1a;电量计量可以帮助人们控制用电量&#xff0c;从而达到节约资源的目的。在当前严峻的资源供应形势下&#xff0c;节约能源是我们应该重视的问题。合理计费&#xff1a;电表可以帮助公共事业单位进行合理计费&#xff0c;…

R包:‘ggcharts好看线图包‘

介绍 ggcharts提供了一个高级{ggplot2}接口&#xff0c;用于创建通用图表。它的目标既简单又雄心勃勃:让您更快地从数据可视化的想法到实际的绘图。所以如何?通过处理大量的数据预处理&#xff0c;为您模糊{ggplot2}细节和绘图样式。生成的图是ggplot对象&#xff0c;可以使用…

物联网系统中市电电量计量方案(二)

上文我们主要介绍了电量计量中最重要的组成部分——电量计量芯片&#xff08;如果没有阅读该文章的&#xff0c;可以点击这里&#xff09;。本文会再为大家介绍电量计量的另外一个组成部分——电流互感器。 电流互感器的定义 电流互感器是一种可将一次侧大电流转换为二次侧小电…

Sentinel-1 Level 1数据处理的详细算法定义(三)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

室内精准定位哪个产品抗干扰能力强?可以用于哪些方面?

室内精准定位产品其实有很多&#xff0c;其实它是安装在室内接收型号的一个基站&#xff0c;并且范围有一定的限制&#xff0c;而被定位的人员需要携带定位产品&#xff0c;那么通过室内基站收集到的信息&#xff0c;将会通过专业的系统处理后呈现在相应的设备上&#xff0c;比…

Linux下常见压缩文件tar.xz、tar.bz2、tar.gz的区别和详解

文章目录 tar.xz tar.bz2 tar.gz 的区别三种文件的解压方式tar.xz的解压三种压缩文件的创建方式 tar.xz tar.bz2 tar.gz 的区别 这三个文件扩展名都表示压缩后的档案文件&#xff0c;但它们使用不同的压缩算法。 tar.xz: tar 代表 Tape Archive&#xff0c;它是一种将多个文件…

f_mkfs格式化最小分区数是191

使用fatfs的f_mkfs最小分区数是191原因&#xff1a; 在挂载ram_disk时参考的文章有提到&#xff1a; “然后是GET_SECTOR_COUNT 用于f_mkfs格式化时获取可用的sector的数量&#xff0c;32bit-LBA的情况下至少为191” 自己也实际试过确实要不少于191&#xff0c;网上也没找到相…

WMS系统的模块构成

WMS系统的模块构成通常包括以下几个主要部分&#xff1a; ———————————————————————————————— 1、库存管理&#xff1a; 主要负责管理仓库内的库存信息&#xff0c;包括库存记录、库存调整、库存盘点等功能。 2、入库管理&#xff1a; 负责处…

samba共享windows和ubuntu的文件

通过Samba服务器实现Windows与Ubuntu之间的文件共享是一个常见的需求&#xff0c;下面是实现这一目标的详细步骤&#xff1a; 一、Ubuntu开启Samba服务器 安装Samba&#xff1a; 打开终端&#xff0c;使用以下命令安装Samba服务&#xff1a; sudo apt update sudo apt install…

html js 3d z轴移动 实现星空

用chatgpt还有kimi 让实现动画效果的星空,都太垃圾了 不是y轴移动,就是x轴移动, 我要z轴移动,他们就是搞不出来, ai写代码还有很长的路。 <!DOCTYPE html> <meta charset="utf-8" /> <head> <title>ai相关博客</title> </h…

同享人力资源管理系统-TXEHR V15 DownloadTemplate 文件读取漏洞复现

0x01 产品简介 同享人力资源管理系统(TXEHR V15)是一款专为现代企业设计的人力资源管理软件解决方案,旨在通过先进的信息化手段提升企业人力资源管理的效率与水平。该系统集成了组织人事、考勤管理、薪资核算、招聘配置、培训发展、绩效管理等核心模块,并提供了灵活的配置…

UNIAPP_ReferenceError: TextEncoder is not defined 解决

错误信息 1、安装text-decoding npm install text-decoding2、main.js import { TextEncoder, TextDecoder } from text-decoding global.TextEncoder TextEncoder global.TextDecoder TextDecoder

专注于国产FPGA芯片研发的异格技术Pre-A+轮融资,博将控股再次投资

近日&#xff0c;苏州异格技术有限公司&#xff08;以下简称“异格技术”&#xff09;宣布成功完成数亿元的Pre-A轮融资&#xff0c;由博将控股在参与Pre-A轮投资后&#xff0c;持续投资。这标志着继2022年获得经纬中国、红点中国、红杉中国等机构数亿元天使轮融资后&#xff0…

C 语言中如何进行函数指针的回调?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

系统架构设计师 - 数学与经济管理

数学与经济管理 数学与经济管理&#xff08;1 - 2分&#xff09;图论应用最小生成树最短路径网络与最大流量 ★ 运筹方法关键路径法 ★ ★ ★线性规划 ★动态规划 ★ ★ ★排队论预测与决策 ★预测 - 博弈论决策 数学建模 ★ ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我…

Java版Flink使用指南——将消息写入到RabbitMQ的队列中

大纲 新建工程新增依赖 编码自动产生数据写入RabbitMQ 测试工程代码 在 《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中&#xff0c;我们介绍了如何使用Java在Flink中读取RabbitMQ中的数据&#xff0c;并将其写入日志中。本文将通过代码产生一些数据&#xf…

OTA与OTA升级

目录 一、OTA简介 二、OTA升级 三、操作方式 一、OTA简介 在嵌入式领域当中&#xff0c;OTA&#xff08;Over-The-Air&#xff09;指的是通过无线通信技术对嵌入式设备的软件进行远程更新和管理。这种技术广泛应用于物联网设备、智能家电、汽车电子、智能手机等领域。通过OTA…

基于 PyTorch 的迁移学习介绍 (图像分类实战演示)

1. 介绍 迁移学习&#xff08;Transfer Learning&#xff09;允许我们采用另一个模型从另一个问题中学到的模式&#xff08;也称为权重&#xff09;并将它们用于我们自己的问题。 例如&#xff0c;我们可以采用计算机视觉模型从 ImageNet&#xff08;包含数百万张不同对象的图…