二次封装 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.rhkb.cn/news/465960.html

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

相关文章

通俗易懂讲STM32为GPIO的8种模式(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出)

本文参照这篇博客---易于理解深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入&#xff0c;开漏输出&#xff0c;推挽输出的区别&#xff0c;以STM32为例)_下拉输出-CSDN博客 一、输入模式 上拉输入 一句话总结&#xff1a;接上拉电阻对输入的低电平能够有效的读取&…

单元测试日志打印相关接口及类 Logger

LoggerFactory 简介 单元测试常用日志打印工具LoggerFactory。 LoggerFactory 代码结构 LoggerFactory 是 JUnit 平台中的一个类&#xff0c;用于创建 Logger 实例。它被设计用于提供日志记录功能&#xff0c;使得 JUnit 在执行测试时能够记录信息、警告、错误等。 LoggerFact…

【万字总结】数据结构常考应用大题做法画法详解_树_哈希表_图_排序大总结

文章目录 1.树相关应用大题1.1 已知二叉树的中序序列和前序or中序&#xff0c;画出二叉树1.2 二叉树的遍历、树的遍历、森林的遍历总结1.3二叉树与森林之间的转换1.3.1 已知树的先序序列和中序序列&#xff0c;画出森林 1.4 二叉树的线索化1.5 二叉排序树1.5.1 二叉排序树的删除…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞&#xff0c;由于部分鉴权代码于v1.6.1版本进行了修改&#xff0c;鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

接口测试用例设计的关键步骤与技巧解析!

简介 接口测试在需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后根据用例进行接口测试。接口测试用例的设计也需要用到黑盒测试用例设计方法&#xff0c;和测试流程与理论章节的功能测试用例设计的方法类似&#xff0c;设计过程中还需要增加与接口特…

Redis常见面试题(二)

Redis性能优化 Redis性能测试 阿里Redis性能优化 使用批量操作减少网络传输 Redis命令执行步骤&#xff1a;1、发送命令&#xff1b;2、命令排队&#xff1b;3、命令执行&#xff1b;4、返回结果。其中 1 与 4 消耗时间 --> Round Trip Time&#xff08;RTT&#xff0c;…

功能超全的客服快捷回复软件

客服日常工作繁忙&#xff0c;需要一款满足各项日常需求的客服工具&#xff0c;完成咨询的快捷回复&#xff0c;并能共享客服团队优质话术&#xff0c;实现云端文件储存&#xff0c;管理表情动图等功能 前言 客服日常工作繁忙&#xff0c;需要一款满足各项日常需求的客服工具。…

靠Python真的能实现经济自由,学会了你也可以

不知道大家有没有注意到&#xff0c;最近关注的很多人都在聊“副业and兼职”这件事。 毕竟单一收入已经不能满足现代人的需求了。 对于普通人来说&#xff0c;想要跳出固定思维和舒适圈&#xff0c;相比于孤注一掷的创业&#xff0c;更推荐兼职。 很多人想要创业&#xff0c;…

【案例分享】借助 iSpring,创造客户真正欣赏的专业在线培训体验

Safety Bee Training是一家领先的认证在线学习提供商&#xff0c;专门提供职业健康、安全和环境项目。它也是中东和亚洲唯一一家提供经 NASP 等国际认证机构认可的课程的培训提供商。它已经培训了超过 28,000 名学习者&#xff0c;并且正在不断扩大其课程范围&#xff0c;以提供…

IP可用端口扫描器工具(bun + typescript)

IP可用端口扫描器工具&#xff08;bun typescript&#xff09; 学习方式&#xff1a;源码学习。通过项目和源码可以学习到如下内容&#xff1a;1、bun搭建项目&#xff0c;打包项目2、net、dns等node内置模块的使用3、yargs、assert、progress、cli-color等三方包的使用ps&am…

docker镜像仓库常用命令

docker镜像仓库常用命令 docker logindocker logoutdocker pulldocker pushdocker searchdocker imagesdocker image inspectdocker tagdocker rmidocker image prunedocker savedocker loaddocker history docker login 语法: docker login [options] [server] 功能&#xff…

软件开发项目管理:实现目标的实用指南

由于软件项目多数是复杂且难以预测的&#xff0c;对软件开发生命周期的深入了解、合适的框架以及强大的工作管理平台是必不可少的。项目管理系统在软件开发中通常以监督为首要任务&#xff0c;但优秀的项目计划、管理框架和软件工具可以使整个团队受益。 软件开发项目管理的主要…

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会让一…

【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析

引言 在现代电子产品中&#xff0c;控制芯片的性能直接影响到设备的功能和用户体验。摇头机、舞台灯、打印机和白色家电等领域对控制精度、功耗和成本等方面的要求日益提高。LV8549/ONSEMI等国际品牌的芯片曾是这些产品的主要选择&#xff0c;但随着国内半导体技术的进步&…

Spring挖掘:(AOP篇)

学习AOP时,我们首先来了解一下何为AOP 一. 概念 AOP&#xff08;面向切面编程&#xff0c;Aspect Oriented Programming&#xff09;是一种编程技术&#xff0c;旨在通过预编译方式或运行期动态代理实现程序功能的统一管理和增强。AOP的主要目标是在不改变原有业务逻辑代码的…

Centos Linux 7 搭建邮件服务器(postfix + dovecot)

准备工作 1. 一台公网服务器&#xff08;需要不被服务商限制发件收件的&#xff0c;也就是端口25、110、143、465、587、993、995不被限制&#xff09;&#xff0c;如有防火墙或安全组需要把这些端口开放 2. 一个域名&#xff0c;最好是com cn org的一级域名 3. 域名备案&am…

深入了解Bootstrap框架:从入门到精通

文章目录 前言Bootstrap的核心特性1. 响应式设计2. 丰富的组件库3. 易于使用4. 良好的兼容性 安装与使用安装1. 通过CDN引入2. 下载源码3. 使用npm或yarn 基本使用1. 栅格系统2. 按钮3. 导航条4. 卡片5. 模态框6. 轮播图7. 表单 高级定制1. 修改 Sass 变量2. 按需引入组件 最佳…

ENSP RIP动态路由

RIP&#xff08;距离矢量路由协议&#xff09;以网络中所有链路的距离和矢量为依据计算最佳路径&#xff0c;是第一个动态路由协议。条数作为唯一的度量单位。默认开启水平分割&#xff08;从一个路由接口学到的路由信息&#xff0c;便不在从这个接口发送出去&#xff09;防止路…

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——模拟芯片 真题题目分享&#xff0c;完整题目&#xff0c;无答案&#xff08;共8套&#xff09; 实习岗位…

MySQL45讲 第十一讲 怎么给字符串字段加索引?

文章目录 MySQL45讲 第十一讲 怎么给字符串字段加索引&#xff1f;一、引言二、前缀索引&#xff08;一&#xff09;概念与创建方式&#xff08;二&#xff09;数据结构与存储差异&#xff08;三&#xff09;确定前缀长度的方法 三、前缀索引对覆盖索引的影响四、其他索引创建方…