Vue使用Element-UI实现分页效果

news2025/1/21 2:56:36

前言

分页在展示数据列表的场景肯定是非常多的。

一般的项目开发中,数据量特别大,一般都是后端接口直接处理分页返回,前端直接调用即可。

但是前端也是可以不需要借助后端,自己也是可以处理分页的。今天我这个后端开发就站在前端的角度上,处理列表分页。

友情提示:

数据量大的情况下一定要后端处理分页,前端虽然可以实现,但是仅限数据量不是特别大的情况下!

先给大家看下我的列表,一个特别单纯的列表,只是返回一个用户列表,并且根据id倒叙排序。

在这里插入图片描述

给大家调用看下吧,一个很简单的结构:

在这里插入图片描述

技术选项:Pagination

这里我选择使用的是element-ui的分页:Pagination

它是ElementUI下的一个组件:

在这里插入图片描述

它的参数特别重要,我们就是借助这些参数实现的分页

以下案例我只是挑选个别参数,更多参数使用说明相间文档

文档:ElementUI-Pagination 分页

在这里插入图片描述

大家根据自己的需求挑选一款即可,挑选不出来心仪可以参考我这一套,我也是精心挑选并且测试了很多参数。

增加分页代码

把这一块加到页面上,就有一个视觉上的分页效果了。

在这里插入图片描述

相关代码:

 <!-- 分页 -->
    <!-- 
        @size-change //  pageSize 改变时会触发 每页条数
        @current-change //  currentPage 改变时会触发 当前页
        :current-page //  默认false
        background//  是否为分页按钮添加背景色
        :page-sizes // 每页显示个数选择器的选项设置 这是下拉框可以选择的,每选择一行,要展示多少内容 类似:[10, 20, 30, 40, 50, 100]
        page-sizes=显示当前行的条数
        layout // 组件布局,子组件名用逗号分隔
       :total // 总条目数,一般从展示列表的总数获取
     -->
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="currentPage"
      background
      :page-sizes="[1,3,5,10,20]"  
      :page-size="pagesize"         
      layout="total, sizes,  prev, pager, next, jumper" 
      :total="userTableData.length">   
    </el-pagination>

注意代码位置,我是把分页放在table下面了:

在这里插入图片描述

初始化数据

紧接着还要定义默认页和默认每页条数,以及数据列表

在这里插入图片描述

userTableData我是用过接口返回值赋值的。

  data() {
    return {
      userTableData: [], // 用户列表
      currentPage:1, // 初始页
      pagesize:10,  // 初始每页的数据
    };
  },

回调函数

然后就是对分页改变做出的回调函数:

在这里插入图片描述

逻辑写死即可,函数名需要和上面保持一致,通常直接复制即可。

 // 初始页currentPage、初始每页数据数pagesize和数据data
        handleSizeChange: function (size) {
                this.pagesize = size;
                console.log(this.pagesize)  //每页下拉显示数据
        },
        handleCurrentChange: function(currentPage){
                this.currentPage = currentPage;
                console.log(this.currentPage)  //点击第几页
        },

到了这里你就可以看到列表分页了,但是会发现实际展示的数据和分页展示的不一致,不要着急,就差最后一步了 !

在这里插入图片描述

指定table分页

出现上面这种情况,是因为列表的data没有适配分页属性:

你现在的代码肯定是这样的:

在这里插入图片描述

最后一步,给要展示的table指定分页以及条件。

一行代码:

 :data="userTableData.slice((currentPage-1)*pagesize,currentPage*pagesize)"

在这里插入图片描述

查看效果

这样就一个由前端代码实现的分页就完成了。我们检测下吧

初始化页面

因为我默认展示的就是第一页,并且每页展示10条嘛,所以就是这样的:
在这里插入图片描述

切换每页条数:

在这里插入图片描述

在这里插入图片描述

大概就是这样的,大家下去自己研究玩吧。

以下为我这个组件的全部代码,大家灵活cv即可:

<template>
  <div>
      <!-- <el-breadcrumb separator="/">
            <el-breadcrumb-item><i class="el-icon-date"></i> 数据管理</el-breadcrumb-item>
            <el-breadcrumb-item>用户列表</el-breadcrumb-item>
        </el-breadcrumb> -->
    <el-button type="primary" icon="el-icon-circle-plus" >新增用户</el-button>
    <!-- 用户列表 -->
    <!-- 
      data 显示的数据   这里增加了分页功能
      highlight-current-row 是否要高亮当前行 默认false
      border 是否带有纵向边框 默认false
      stripe 是否为斑马纹 默认false
      fit 列的宽度是否自撑开	默认true
      cell-style 通过回调函数逻辑操作增加style样式
     -->
    <el-table 
      :data="userTableData.slice((currentPage-1)*pagesize,currentPage*pagesize)"  
      highlight-current-row 
      border 
      stripe
      fit 
      :cell-style="cellStyle"  >
    <!-- 自定义索引 --> 
      <el-table-column label="序号" type="index" width="50" align="center" :index="indexMethod"></el-table-column>
      <!-- <el-table-column prop="id" label="id" width="90" align="center"></el-table-column> -->
      <!-- 用户名 -->
      <!-- 
        prop  字段值
        label 字段名称
        width 宽度
        align 是否剧中
       -->
      <el-table-column prop="userName" label="姓名"  width="80" align="center" ></el-table-column>
      <!-- 性别 01-->
      <el-table-column label="性别" width="50" align="center" prop="sex" heign>
        <template slot-scope="scope">
          <!-- scope.row就是这一行的全部数据 动态判断性别字典 -->
          {{ scope.row.sex === 0 ? "女" : "男"}}
        </template>
      </el-table-column>
      <!-- <el-table-column prop="account" label="账号"  width="150" align="center"></el-table-column>
      <el-table-column prop="password" label="密码" width="100" align="center"></el-table-column> -->
       <!-- 头像 -->
      <el-table-column prop="imnage" label="头像" width="90"  align="center"></el-table-column>
      <!-- 手机号 -->
      <el-table-column prop="phone" label="手机号" width="150" align="center">
        <!-- 给内容增加一个icon图标 -->
        <template slot-scope="scope">    
            <i class="el-icon-phone"></i>
            <span style="margin-left: 10px">{{scope.row.phone}}</span>
        </template>
      </el-table-column>
      <!-- 备注 -->
      <el-table-column prop="remark" label="备注" width="190" align="center"></el-table-column>
      <!-- 账号状态 -->
      <el-table-column label="账号状态" width="80" align="center" prop="status">
        <template slot-scope="scope">
          {{scope.row.status === 0 ? "正常" : "禁用"}}
        </template>
      </el-table-column>
      <!-- 生日 -->
      <el-table-column   prop="birthday" label="生日" width="200" align="center" sortable>
       <template slot-scope="scope">    
            <i class="el-icon-time"></i>
            <span style="margin-left: 10px">{{scope.row.birthday}}</span>
      </template>
      </el-table-column>
      <!-- 操作列  -->
      <!-- fixed 列是否固定在左侧或者右侧,true 表示固定在左侧  可选:true, left, right -->
    <el-table-column fixed="right"  label="操作"  width="220" align="center" >
      <template slot-scope="scope"> 
        <!--
           scope.row就是这一行的数据  
           size 尺寸 medium / small / mini
           type 类型 	primary / success / warning / danger / info / text
           icon 图标类名
        -->
        <el-button @click="handleDelete(scope.row)" type="danger" icon="el-icon-delete"  size="small" >删除</el-button>
        <el-button type="warning" icon="el-icon-edit" size="small">编辑</el-button>
      </template>
    </el-table-column>

      <!-- <el-table-column
      prop="createTime"
      label="创建时间"
      width="180"
    ></el-table-column>
    <el-table-column
      prop="updateTime"
      label="修改时间"
      width="180"
    ></el-table-column> -->
    </el-table>
    <!-- 分页 -->
    <!-- 
        @size-change //  pageSize 改变时会触发 每页条数
        @current-change //  currentPage 改变时会触发 当前页
        :current-page //  默认false
        background//  是否为分页按钮添加背景色
        :page-sizes // 每页显示个数选择器的选项设置 这是下拉框可以选择的,每选择一行,要展示多少内容 类似:[10, 20, 30, 40, 50, 100]
        page-sizes=显示当前行的条数
        layout // 组件布局,子组件名用逗号分隔
       :total // 总条目数,一般从展示列表的总数获取
     -->
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="currentPage"
      background
      :page-sizes="[1,3,5,10,20]"  
      :page-size="pagesize"         
      layout="total, sizes,  prev, pager, next, jumper" 
      :total="userTableData.length">   
    </el-pagination>
  </div>
</template>

<script>
// 引入axios
import axios from "axios";
export default {
  name: "User",
  data() {
    return {
      userTableData: [], // 用户列表
      currentPage:1, // 初始页
      pagesize:10,  // 初始每页的数据
    };
  },
  methods: {
        // 初始页currentPage、初始每页数据数pagesize和数据data
        handleSizeChange: function (size) {
                this.pagesize = size;
                console.log(this.pagesize)  //每页下拉显示数据
        },
        handleCurrentChange: function(currentPage){
                this.currentPage = currentPage;
                console.log(this.currentPage)  //点击第几页
        },
    //改变表格某一列或者某一个单元格文本颜色 
    cellStyle({row, column, rowIndex, columnIndex}) {
      // 定义样式变量
      let cellStyle;
      // 根据每一行的status属性的值进行判断
      // 如果是正常就展示以绿色字体展示,如果是禁用就以红色颜色展示
      switch(row.status) {
        // 0代表正常
          case 0:
            // 设置文本颜色 绿色 可以直接写颜色编码,也可以直接写颜色的单词
            cellStyle = 'color:#70DB93';
            break;
            // 0代表金禁用
          case 1:
            // 设置文本颜色 红色
            cellStyle = 'color:red';
            break;
            // 如果有其他状态,就默认显示,不给文本颜色
          default:
          cellStyle = '';
      }
        
        //return cellStyle  // 返回最终处理过的样式 这样写就是让全部行被style修饰
        // 返回最终处理过的样式 只让账号状态这个属性的属性被style修饰
         if(column.label == '账号状态'){
          return cellStyle
        }
    },
    // 展示用户列表      
    queryUserList() {
       axios.get('http://localhost:9090/user/queryList', {
          // 传递的参数
          params: {
          
          }
          // 回调函数,一定要使用箭头函数,不然this的指向不是vue示例
          }).then(res =>{
            // 请求成功后的数据返回给用户列表用于展示
             this.userTableData = res.data.data;
          }).catch(error =>{
             console.log(error)
          })
    },
    // 序列自增
    indexMethod(index) {
      // 每次自增1 可灵活修改
      return (index += 1);
    },
    // 删除
    handleDelete(row) {
        // 确认框确认是否要删除
        this.$confirm("确定要删除"+row.userName+"吗?", "删除提示", {
          iconClass: "el-icon-question", //自定义图标样式
          confirmButtonText: "残忍删除", //确认按钮文字
          cancelButtonText: "留你小命", //取消按钮文字
          showClose: true, //是否显示右上角关闭按钮  默认false
          type: "warning", //提示类型  success/info/warning/error
          //center:"true", //文字居中 默认false
      }).then(res=> {  //选择确认按钮进入此方法
          //确认操作 请求删除接口
         axios.get('http://localhost:9090/user/delete', {
          // 传递的参数
          params: {
            id:row.id //id,从row获取当前行的用户id
          }
          // 回调函数,一定要使用箭头函数,不然this的指向不是vue示例
          }).then(res =>{
              // 删除成功
              if(res.data.status===200){
                // 删除成功提示
                this.$message({showClose: true, message: '删除成功!',type: 'success', duration:1000,center:true});
                // 重新刷新最新的用户列表
                this.queryUserList();
              }
             
          }).catch(error =>{
             console.log(error)
          })
      }).catch(() => { //选择取消按钮进入此方法
        //取消操作
      });    
    }
    // 打开新增用户的弹窗
      //  open() {
      //   this.$alert('这是一段内容', '标题名称', {
      //     confirmButtonText: '确定',
      //     callback: action => {
      //       this.$message({
      //         type: 'info',
      //         message: `action: ${ action }`
      //       });
      //     }
      //   });
      // },
  },
  mounted() {
    // 页面加载就渲染用户列表
    this.queryUserList();
  },
};
</script>

<style  >
</style>



总结

感觉elementui对分页组件做的特别好。使用起来也特别简单,这样我不管从前后端哪个维度,都可以实现分页了,又多学了一个技能,如果这篇文章对你有用,那就是对我最大的支持!

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

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

相关文章

H5画布 canvas(一)canvas简介、绘制圆形/矩形、案例饼状图绘制

目录 1. canvas 简介 2. canvas 标签介绍 3. canvas 上下文 Context 4. 案例&#xff1a;在 canvas 画布中绘制表格 5. canvas 的 beginPath 状态 6. 绘制矩形 rect 7. 绘制圆形 arc 8. 案例&#xff1a;根据一组数据绘制饼状图 1. canvas 简介 canvas 是HTML5 提供的一…

【蓝桥杯Web】大一小白参与蓝桥杯模拟赛二期web组体会

目录 前言 一、相关比赛介绍 1.ACM国际大学生程序设计竞赛 2.蓝桥杯 3.GPLT团队程序设计天梯赛 4.leetcode周赛和双周赛 5.PAT 二、蓝桥杯 1.应该参加蓝桥杯吗&#xff1f; 2.如何进行蓝桥杯的准备 三.蓝桥杯模拟赛二期web组真题 1.凭空消失的TA&#xff08;简单&a…

node-sass安装失败解决方法,终有一款适合我们

项目中常常遇到node-sass安装失败&#xff0c;动不动就是报各种错误。以前我一次也没有失败过&#xff0c;自从系统重装我的天呀&#xff0c;node-sass就没有成功过&#xff0c;我能做的node卸载&#xff0c;sass重装各种版&#xff0c;以及换了淘宝镜像和用了vpn都安装失败。我…

Vue--Router--解决多路由复用同一组件页面不刷新问题

原文网址&#xff1a;Vue--Router--解决多路由复用同一组件页面不刷新问题_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何解决Vue的多路由复用同一组件页面不刷新问题。 多路由复用同一组件的场景 多路由使用同一组件 比如&#xff1a;添加博客&#xff08;path为&…

H5如何实现唤起APP

前言 写过hybrid的同学&#xff0c;想必都会遇到这样的需求&#xff0c;如果用户安装了自己的APP&#xff0c;就打开APP或跳转到APP内某个页面&#xff0c;如果没安装则引导用户到对应页面或应用商店下载。这里就涉及到了H5与Native之间的交互&#xff0c;为什么H5能够唤起APP…

【简陋Web应用3】实现人脸比对

文章目录&#x1f349; 前情提要&#x1f337; 效果演示&#x1f95d; 实现过程1. utils.py2. compare.html3. forms.py4. insightface_api.py5. app.py&#x1f345; 记录1. Bugs1.1 cv2.imshow()报错1.2 insightface人脸检测标注框错乱(&#x1f4a2;)2. 杂记&#x1f33e; 小…

给el-table-column添加指定列的点击事件该怎么做

嗨害嗨&#xff0c;我又来了奥。大家在工作中用组件吗&#xff1f;elementUI应该都用过吧&#xff0c; element是一套UI组件库,是由国内饿了么团队开发的。它提供了丰富的PC组件,有效地降低了使用者的开发难度。 如果工作中遇到了表格&#xff0c;我们经常会用el-table组件来写…

微信小程序 slot插槽基本使用

文章目录前言一、基本插槽二、具名插槽三、样式:hoststyleIsolation可控化样式隔离externalClasses外部样式类使用页面/父组件的样式总结前言 小程序中, 如果插槽有必要拿到父组件的数据来展示, 直接父传子即可, 和Vue一样的思路 一、基本插槽 参考Vue的基本插槽, 两者的使用…

初入微前端---qiankun学习这一篇就够了,并在vite中使用qiankun

目录 原因 Why Not iframe&#xff1f; qiankun 使用qiankun部署项目 在子路由的页面去暴露根元素 Create-react-app 子应用 在vite中使用qiankun 方法一&#xff08;不太推荐&#xff09;&#xff1a; 方法二&#xff08;推荐&#xff09;&#xff1a; 安装插件 修…

vue2双向数据绑定基本原理

vue2的双向数据绑定(又称响应式)原理&#xff0c;是通过数据劫持结合发布订阅模式的方式来实现的&#xff0c;通过Object.defineProperty()来劫持各个属性的setter&#xff0c;getter&#xff0c;在数据变动时发布消息给订阅者&#xff0c;触发相应的监听回调来渲染视图。也就是…

vue3+vite项目,安装依赖运行报错“failed to load config from xxx,TypeError: vite.createFilter is not a function”

问题 今天从GitHub上拉下来了一个vue3vite项目&#xff0c;之前就是安装依赖就可以运行了&#xff0c;但是今天一直报错&#xff0c;显示TypeError: vite.createFilter is not a function 错误原因 vite版本与安装的依赖版本不匹配 近期vite3发布&#xff0c;但我们使用的…

node-sass版本不兼容问题(已解决)

node-sass版本不兼容问题&#xff08;已解决&#xff09; 估计很多小伙伴都遇到node-sass版本不兼容的问题&#xff0c;今天分享给大家如何定位问题&#xff0c;怎样去查找并兼容自己项目中的nod-sass版本&#xff01; 文章目录node-sass版本不兼容问题&#xff08;已解决&…

JavaScript之Ajax-axios表单提交

目录 一.表单概念 二.表单提交 三.FormData语法 四.头像上传模板 五.请求体类型 六.图书管理(增删改查) 七.axios语法优化写法 优化1: axios全局配置 优化2: 默认的method 优化3: axios的快捷方法 一.表单概念 form标签&#xff08;表单&#xff09;是用来收集用户…

JavaWeb《一》概念、服务器部署及servlet

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 本文是javaweb的第一篇&#xff0c;首先介绍了javaweb&#xff0c;然后进行了一个简单的web服务器部署&#xff0c;把我的一个网页发布到了云端&#xff0c;且叫他小Sa&#xff0c;目前啥也没有&#xff0c;之后会使…

vue3插槽、具名插槽、作用域插槽-足够入门了!

vue3 插槽 前言 这篇文章介绍vue组件的插槽&#xff01;包括&#xff1a;插槽概念&#xff0c;具名插槽&#xff0c;作用域插槽等等&#xff0c;看完不会你打我。哈哈哈&#xff0c;开玩笑的&#xff0c;不多说&#xff0c;上刺刀&#xff01;&#xff01; 1. 概念 插槽&…

给饿了么Radio 单选框添加点击事件(vue2)

前言 最近有一个这样的需求&#xff0c;当点击不合格时打开一个弹窗进行不合格数据的录入。问题点在于当你想对不合格数据进行修改时&#xff0c;点击不合格是没有反应的&#xff1b;因为Radio 单选框只提供了一个change 事件 解决 这里说明一下&#xff0c;项目是vue2的项目…

Vue 全套教程(一),入门 Vue 必知必会

Vue(一) 文章目录Vue(一)一、Vue简介1. 介绍2. 特点二、HelloWorld三、v-bind指令四、v-model指令五、el与data的两种写法5.1 el的两种写法5.2 data的两种写法六、MVVM模型七、Object.defineProperty方法八、数据代理8.1 数据代理概念8.2 Vue中的数据代理九、事件处理9.1 基本使…

【前端】Vue+Element UI案例:通用后台管理系统-导航栏

文章目录目标代码0.数据1.其他准备2.结构3.动态显示数据4.主题&#xff1a;背景色&#xff0c;点击悬停效果5.去除padding6.去除下拉框7.标题8.路由跳转总代码组件CommonAside.vue文件结构参考参考视频&#xff1a; VUE项目&#xff0c;VUE项目实战&#xff0c;vue后台管理系统…

Vue父传子详细教程

本文父组件&#xff1a;shopping.vue 子组件&#xff1a;shoplist.vue 1.父组件引入子组件 1.1.引入组件 import shoplist from ../shoplist.vue 1.2.注册组件 components: { shoplist } 1.3.使用组件 <shoplist></shoplist> 2.父组件定…

vue-admin-beautiful:npm ERR! code ERESOLVE npm ERR! code E451

记录一个离谱的编译错误。 克隆vue-admin-beautiful项目&#xff0c;master分支可以正常拉取&#xff0c;vue3.0-antdv编译报下面的错误。 尝试一&#xff1a; $ cnpm install Install fail! Error: GET https://registry.npmmirror.com/vab-config response 451 status Error…