二次封装 el-pagination 组件存在的问题

在使用 Element Plus 组件时,有时会遇到组件不完全符合需求的情况,这时可能需要对其进行二次封装。在封装 Pagination 组件时,我们会发现一些属性和函数无法正常使用,下面将详细探讨这些问题,并提供一下思路和想法。

封装组件代码如下:

import { ElPagination } from 'element-plus';
import './index.less';export default defineComponent({name: 'MyPagination',props: paginationProps,setup(props, { attrs, slots }) {return () => (<div class={`pagination-common`}><ElPagination{...props}{...attrs}>{slots.default ? slots.default() : null}</ElPagination></div>);},
});

1. 属性

1.1 pageSize 属性

在使用自定义 MyPagination 组件时:

import { defineComponent, ref } from "vue";
import { MyPagination } from "../MyPagination";
import "./index.less";export default defineComponent({name: "Demo",setup() {return () => (<div class="paginationContainer"><MyPaginationlayout="total, sizes, prev, pager, next, jumper"total={500}pageSize={20}/></div>);}
});

代码警告⚠️:

简单分析一下,可以看到是 pageSize 出现问题导致的报错,为什么呢?

对于 Element Plus 的 Pagination 组件而言,pageSize 是一个受控属性,也就是需要外部管理它的值并对变动进行响应。

那该属性应该怎么使用呢?

import { defineComponent, ref } from "vue";
import { MyPagination } from "../MyPagination";
import "./index.less";export default defineComponent({name: "Demo",setup() {const pageSize = ref(30);return () => (<div class="paginationContainer"><MyPaginationlayout="total, sizes, prev, pager, next, jumper"total={500}v-model:pageSize={pageSize.value}/></div>);}
});

成功展示的原因:

1、双向绑定机制

使用 v-model 实现双向绑定,确保组件内的 pageSize 更新会自动反映到外部的数据(pageSizeRef),从而保持组件和外部状态的一致。

2、事件触发更新

Pagination 组件内部会触发 update:pageSize 事件来通知外部其 pageSize 的改变。使用 v-model:pageSize 可以自动捕获并处理这个事件,避免手动监听 update:pageSize 事件。

1.2 currentPage 属性

同理 currentPage 表示当前的页码,也是受控属性,需要绑定 v-model。当用户点击分页控件来切换页码时,Pagination 组件 会触发 update:currentPage 事件更新外部的 currentPage 绑定的变量。

使用如下:

import { defineComponent, ref } from "vue";
import { MyPagination } from "../MyPagination";
import "./index.less";export default defineComponent({name: "Demo",setup() {const currentPage = ref(3);const pageSize = ref(30);return () => (<div class="paginationContainer"><MyPaginationlayout="total, sizes, prev, pager, next, jumper"total={500}v-model:pageSize={pageSize.value}v-model:currentPage ={currentPage.value}/></div>);}
});

1.3 total 属性

total 表示数据总数,也是受控属性。

虽然 total 本身不需要 v-mode(因为其通常是只读属性,用于展示总数据量),但在某些场景下会根据后端返回数据动态更新,因此不使用 v-model 绑定的情况较多。

2. 方法

大家如果使用过这个组件,肯定了解其身上存在 4 个常见方法,其中,唯一能够正常使用的方法是 currentChange,而其他方法则需要额外处理才能执行。感兴趣的朋友可以亲自尝试一下,这里就不详细介绍啦。

解决方法,我们点开 Pagination 组件 props 的源码可以看到方法的名称:

因此在使用的时候,严格遵循命名规则,如下:

import { defineComponent, ref } from "vue";
import { MyPagination } from "../MyPagination";
import "./index.less";export default defineComponent({name: "Demo",setup() {const currentPage = ref(3);const pageSize = ref(30);const handleCurrentChange = (val) => {console.log(`当前页码已变更,新的页码为:${val} 页`);};const handleSizeChange = (size) => {console.log(`每页显示的条数已变更,新的条数为:${size} 条`);};const handlePrevClick = (page) => {console.log(`点击上一页按钮,点击之前页码为:${page} 页`);};const handleNextClick = (page) => {console.log(`点击下一页按钮,点击之前页码为:${page} 页`);};return () => (<div class="paginationContainer"><MyPaginationlayout="total, sizes, prev, pager, next, jumper"total={500}v-model:pageSize={pageSize.value}v-model:currentPage ={currentPage.value}onCurrent-change={handleCurrentChange}onSize-change={handleSizeChange}onPrev-click={handlePrevClick}onNext-click={handleNextClick}/></div>);}
});

所有的方法均可以成功使用:

如果到目前为止仍然存在一些问题,那么我们就需要使用 emits 来更新数据。

添加如下代码:

import { ElPagination } from 'element-plus';
import './index.less';export default defineComponent({name: 'MyPagination',props: paginationProps,emits: ["update:prevClick","update:nextClick","currentChange","update:sizeChange",],setup(props, { attrs, slots }) {return () => (<div class={`pagination-common`}><ElPagination{...props}{...attrs}>{slots.default ? slots.default() : null}</ElPagination></div>);},
});

emits 用于声明组件可以发出的自定义事件。这使得父组件能够监听这些事件,并对其作出响应。通过声明 emits 可以清晰地定义组件的外部接口。

至此,已经解决了我在封装 Pagination 组件所遇到的问题,如果还有其他的问题,可以继续深入探讨。

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

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

相关文章

Elasticsearch-linux环境部署

本文主要介绍linux下elasticsearch的部署。通过在一台linux服务器中分别对elasticsearch-6.7.2版本&#xff0c;elasticsearch-7.3.0版本来进行安装&#xff0c;记录在安装elasticsearch-7.3.0版本时出现的异常情况&#xff0c;以及elasticsearch-head的安装。 基础环境 本机已…

超子物联网HAL库笔记:串口篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 这篇文章介绍了HAL库串口大多的使用方法&#xff0c;并配有详细的思路和注释…

指标平台帮助企业在业务运营过程中快速定位和解决业务问题

在业务运营中&#xff0c;指标平台扮演着至关重要的角色&#xff0c;它将复杂的数据模型转化为业务人员易于理解的业务指标。通过实时监控、预警归因、自助分析等功能&#xff0c;帮助企业快速定位和解决业务问题。以 Aloudata CAN 自动化指标平台为例&#xff0c;该平台通过统…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…

【算法】(Python)动态规划

动态规划&#xff1a; dynamic programming。"programming"指的是一种表格法&#xff0c;而非编写计算机程序。通常解决最优化问题&#xff08;optimization problem&#xff09;。将问题拆分成若干个子问题&#xff0c;求解各子问题来得到原问题的解。适用于多阶段…

《无线重构世界》射频模组演进

射频前端四大金刚 射频前端由PA、LNA、滤波器、开关“四大金刚” 不同的模块有自己的工艺和性能特点 分层设计 射频前端虽然只由PA、LNA、开关、混频器4个模块构成&#xff0c;但不同模块之间相互连接且相互影响。如果将射频系统当成一个整体来理解&#xff0c;其中的细节和…

【C#】使用.net9在C#中向现有对象动态添加属性

在 C# 中向现有对象动态添加属性并不像在 Python 或 JavaScript 中那样容易&#xff0c;因为 C# 是一种强类型语言。 但是&#xff0c;我们可以通过使用一些技术和库来实现这一点&#xff0c;例如扩展方法、字典等。本文将详细介绍如何在 C# 中实现这一点。ExpandoObject 方法 …

编程语言之战:AI 之后的 Kotlin 与 Java

随着人工智能不断重塑科技格局&#xff0c;开发人员越来越面临选择哪些编程语言在 AI 开发方面最有利和有效的任务。 考虑到 AI 和机器学习的快速发展&#xff0c;一种编程语言是否更适合满足这一不断发展的领域的需求&#xff1f; 自 1995 年问世以来&#xff0c;Java 一直是编…

web前端

HTML HTML 超文本标记语言。 H5 HTML v5 get/post/delete/put ---- restful web开发 结构 样式动作 架构 装饰 交互 标签 文本相关 图片、图像、声音 导航 表格 列表 表单标签 布局标签 h5扩展 HTML入门 HBuilder安装 下载 运行HBuilder 创建workspace存储项目 创…

[react]10、react性能优化

1、列表&key 一、React更新流程 React在props或state发生改变时&#xff0c;会调用React的render方法&#xff0c;会创建一颗不同的树。React需要基于这两颗不同的树之间的差别来判断如何有效的更新UI。 同层节点之间相互比较&#xff0c;不会垮节点比较;不同类型的节点&am…

基础网络安全知识

1.ctfhub技能树 1.1 Web-SQL注入 Web-SQL注入-整数型 && 字符型 && MySQL结构 参考&#xff1a;5.9.6MySql注入 Web-SQL注入-报错注入 step1: 查库名 ?id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- step2: 查看表名 ?id1 and extractvalue(1…

一、初识C语言(1)

1.C语言识别的是二进制语言 C语言是一门计算机语言&#xff0c;计算机是硬件&#xff0c;硬件分通电&#xff08;1&#xff09;和 未通电&#xff08;0&#xff09;两种情况&#xff0c;所以C语言识别的都是0 / 1信号&#xff0c;也就是二进制语言。 2.C语言文件类型以及基本框…

传输协议设计与牧村摆动(Makimoto‘s Wave)

有一条活鱼和一条死鱼&#xff0c;你准备怎么做&#xff0c;你会将活鱼红烧或将死鱼清蒸吗&#xff1f;好的食材只需要最简单的烹饪&#xff0c;不好的食材才需要花活儿。 我此前的文字几乎都在阐述一个观点&#xff0c;广域网就是那条死鱼&#xff0c;数据中心则是那条活鱼。…

80后聊架构:架构设计中两个重要指标,延时与吞吐量(Latency vs Throughput) | 架构师之路...

《架构师之路&#xff1a;架构设计中的100个知识点》 3.延时与吞吐量 有朋友问我说&#xff0c;架构优化时&#xff0c;什么时候要重点优化延时&#xff0c;什么时候要重点优化吞吐量&#xff1f; 画外音&#xff1a;补充阅读材料在最后。 延时&#xff08;Latency&#xff09;…

全星魅-物联网定位终端-北斗定位便携终端-北斗有源终端

在当今快速发展的物流运输行业中&#xff0c;精准定位与实时监控已成为确保货物安全与高效运输的关键因素。为了满足这一需求&#xff0c;QMCZ10作为一款集4G&#xff08;LTE Cat1&#xff09;通讯技术与智能定位功能于一体的终端产品&#xff0c;应运而生。它不仅具备普通定位…

网络编程(一):UDP socket api => DatagramSocket DatagramPacket

目录 1. TCP 和 UDP 1.1 TCP / UDP 的区别 1.1.1 有连接 vs 无连接 1.1.2 可靠传输 vs 不可靠传输 1.1.3 面向字节流 vs 面向数据报 1.1.4 全双工 vs 半双工 2. UDP socket api 2.1 DatagramSocket 2.1.1 构造方法 2.1.2 receive / send / close 2.2 DatagramPacket …

JDBC入门

什么是JDBC JDBC&#xff08;Java DataBase Connectivity&#xff09;就是Java数据库连接&#xff0c;说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库&#xff0c;JDBC是用Java语言向数据库发送SQL语句。 使用JDBC 使用JDBC会用到它…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress是一个基于React框架开发的开源发布平台&#xff0c;它不仅仅是一个简单的博客系统&#xff0c;更是一个功能全…

Linux挖矿病毒(kswapd0进程使cpu爆满)

一、摘要 事情起因:有台测试服务器很久没用了&#xff0c;突然监控到CPU飙到了95以上&#xff0c;并且阿里云服务器厂商还发送了通知消息&#xff0c;【阿里云】尊敬的xxh: 经检测您的阿里云服务&#xff08;ECS实例&#xff09;i-xxx存在挖矿活动。因此很明确服务器中挖矿病毒…

Stable Diffusion LoRA, LyCoris

本节内容&#xff0c;给大家带来的是stable diffusion的LoRA与LyCoris模型课程。我们在上节课程中&#xff0c;已经详细讲解了关于大模型的使用。在stable diffusion中打造一个大模型&#xff0c;需要基于大量特定特征的图像集进行训练&#xff0c;我们通常将这个过程称之为Dre…