Vue.js 中使用 Element UI 实现异步加载分页列表

Vue.js 中使用 Element UI 实现异步加载分页列表

在前端开发中,我们常常需要展示大量数据,并提供分页浏览的功能。本篇博客将介绍如何使用 Vue.js 和 Element UI 组件库创建一个简单的异步加载分页列表。

技术栈

  • Vue.js
  • Element UI
  • JavaScript

组件结构

我们将创建一个包含表格和分页组件的 Vue 单文件组件。以下是组件的基本结构:

<template><div class="table-container"><!-- 表格组件 --><el-table :data="currentPageData" style="width: 66%"><el-table-column label="ID" prop="id"></el-table-column><el-table-column label="名称" prop="name"></el-table-column><el-table-column label="价格" prop="price"></el-table-column></el-table><!-- 分页组件 --><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage":page-sizes="[10, 20, 30, 40]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="tableData.length"></el-pagination></div>
</template><script>
export default {data() {return {tableData: [],         // 存储列表数据currentPage: 1,        // 当前页码pageSize: 10,          // 每页条数};},computed: {currentPageData() {// 根据当前页码和每页条数计算当前显示数据const start = (this.currentPage - 1) * this.pageSize;const end = start + this.pageSize;return this.tableData.slice(start, end);},},methods: {handleSizeChange(val) {// 处理每页条数变化this.pageSize = val;this.currentPage = 1;   // 将当前页重置为第一页},handleCurrentChange(val) {// 处理当前页变化this.currentPage = val;},},created() {// 模拟异步加载数据setTimeout(() => {this.tableData = Array.from({ length: 33 }, (_, index) => ({id: index + 1,name: `商品${index + 1}`,price: Math.floor(Math.random() * 100) + 50,}));}, 500);},
};
</script><style scoped>
.table-container {display: flex;justify-content: center;align-items: center;flex-direction: column;
}
</style>

创建过程

  1. 引入 Element UI: 在项目中引入 Element UI 组件库。可以使用 npm 或 yarn 安装 Element UI。

    npm install element-ui
    

    main.js 中引入并使用 Element UI:

    import Vue from 'vue';
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';Vue.use(ElementUI);
    
  2. 创建组件: 创建一个 Vue 单文件组件,定义表格和分页的结构。

  3. 异步加载数据: 使用 created 钩子模拟异步加载数据。在实际项目中,将从后端 API 获取数据。

  4. 分页功能: 使用 Element UI 提供的分页组件实现分页功能。监听分页组件的事件,更新当前页码和每页条数。

main.js :

import Vue from 'vue'import App from './App.vue'import ElementUI from 'element-ui';import 'element-ui/lib/theme-chalk/index.css';import ListDisplay from './components/ListDisplay.vue';Vue.config.productionTip = falseVue.use(ElementUI);new Vue({render: h => h(App),components: {ListDisplay,},template: '<ListDisplay />',}).$mount('#app')

App.vue:


<template><div id="app"><ListDisplay /></div>
</template><script>
import ListDisplay from "@/components/ListDisplay.vue";
// import ListDisplay from "@/components/separation-of-duties/ListDisplay.vue";export default {name: 'App',components: {ListDisplay,}
}
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

当然列表组件也可以拆开来展示

<template><div class="table-container"><MyTable :data="currentPageData"></MyTable><MyPagination:current-page="currentPage":page-size="pageSize":total="tableData.length"@size-change="handleSizeChange"@current-change="handleCurrentChange"></MyPagination></div>
</template><script>
import MyTable from "././MyTable.vue";
import MyPagination from "././MyPagination.vue";export default {components: {MyTable,MyPagination,},data() {return {tableData: [],currentPage: 1,pageSize: 10,};},computed: {currentPageData() {const start = (this.currentPage - 1) * this.pageSize;const end = start + this.pageSize;return this.tableData.slice(start, end);},},methods: {handleSizeChange(val) {this.pageSize = val;this.currentPage = 1;},handleCurrentChange(val) {this.currentPage = val;},},created() {// 模拟异步加载数据setTimeout(() => {this.tableData = Array.from({length: 33}, (_, index) => ({id: index + 1,name: `商品${index + 1}`,price: Math.floor(Math.random() * 100) + 50,}));}, 500);},
};
</script><style scoped>
.table-container {display: flex;justify-content: center;align-items: center;flex-direction: column;
}
</style>

MyTable:

<template><el-table :data="data" style="width: 100%"><el-table-column label="ID" prop="id"></el-table-column><el-table-column label="名称" prop="name"></el-table-column><el-table-column label="价格" prop="price"></el-table-column></el-table>
</template><script>
export default {props: {data: {type: Array,default: () => [],},},
};
</script><style scoped>
</style>

MyPagination:

<template><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage":page-size="pageSize":page-sizes="[10, 20, 30, 40]"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination>
</template><script>
export default {props: {currentPage: {type: Number,required: true,},pageSize: {type: Number,required: true,},total: {type: Number,required: true,},},methods: {handleSizeChange(val) {this.$emit('size-change', val);},handleCurrentChange(val) {this.$emit('current-change', val);},},
};
</script><style scoped>
</style>

实现效果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat里放大、缩小字体的快捷方法

我是偶然误触键盘把字体缩小了&#xff0c;研究以后发现的这个快捷键&#xff0c;分享给大家。 方法&#xff1a;按住【CtrlShift】组合键&#xff0c;再拖动鼠标滚轮&#xff0c;就可以缩放字体了。 缩小效果&#xff1a; 放大效果&#xff1a;

轻量级web开发框架Flask本地部署及无公网ip远程访问界面

文章目录 前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用P…

Matlab论文插图绘制模板第131期—函数等高线图

在之前的文章中&#xff0c;分享了Matlab函数折线图的绘制模板&#xff1a; 函数三维折线图&#xff1a; 函数网格曲面图&#xff1a; 函数曲面图&#xff1a; 进一步&#xff0c;再来分享一下函数等高线图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数…

FPGA模块——以太网(1)MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

数字IC与模拟IC到底哪个更适合你?一文为你讲清楚(内附学习视频)

选数字IC还是模拟IC&#xff1f; 这是很多同学进入IC行业的一个难题&#xff0c;后台也有很多同学问模拟IC和数字IC的区别。 本文就从大家比较关心的内容入手&#xff0c;分析这两个方向的异同。&#xff08;文末有免费学习视频哦~&#xff09; 这里放个入口&#xff1a;IC入…

国产低成本Wi-Fi SoC解决方案芯片ESP8266与ESP8285对比差异

目录 ESP8266与ESP8285对比差异微信号&#xff1a;dnsj5343ESP8285简介ESP8285 主要特性Wi-Fi特性射频模块CPU特性硬件软件 ES8285 8266通用开发板 ESP8266与ESP8285对比差异 ESP8285相当于在ESP8266基础上多加了1/2MB Flash&#xff0c; ESP8285与ESP8266同用一套SDK&#xf…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…

AIGC绘画关键词 - 神兽类(一)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

[安洵杯 2019]Game复现

[安洵杯 2019]Game IDA64打开 开了混淆&#xff0c;控制流平坦化&#xff0c;可以使用deflat.py进行去除。 要去除的有多个函数&#xff0c;再进行多次重复去除后可以得到 代码不多&#xff0c;慢慢分析&#xff0c;前面是一些生成数独以及检查。 直接看check部分&#xff0c…

3. 创建型模式 - 生成器模式

亦称&#xff1a; 建造者模式、Builder 意图 生成器模式是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象&#xff0c; 在对其进行构造时需要对诸多成员变量和嵌套对象…

内网渗透:拿下一台内网主机后如何继续攻击拿下域控主机

目录 #### 域的定义&#xff1a;将网络中的多台计算机在逻辑上组织到一起&#xff0c;进行集中管理。 域控攻击目标 1. 判断当前主机是否在域中 windows系统的三种登录方式 NTLM协议 从上篇文章拿下10.0.1.4这台服务器后&#xff0c;发展对内网进行攻击&#xff0c;打穿这…

VueDraggablePlus - 免费开源的 Vue 拖拽组件,支持 Vue2 / Vue3,还被尤雨溪推荐了

今天在网上看到尤雨溪推荐的这款拖拽组件&#xff0c;试了一下非常不错&#xff0c;同样推荐给大家。 VueDraggablePlus 是一个专为 Vue 打造的拖拽排序模块&#xff0c;基于 Sortablejs 封装&#xff0c;支持 Vue3 或 Vue 2.7&#xff0c;本月的 21 日&#xff0c;Vue 作者尤…