二次封装 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">
        <MyPagination
          layout="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">
        <MyPagination
          layout="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">
        <MyPagination
          layout="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">
        <MyPagination
          layout="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 组件所遇到的问题,如果还有其他的问题,可以继续深入探讨。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想唱就唱 2.15.63| 电视免VIP唱K软件,支持手机点歌

想唱就唱是一款实用性强的K歌软件&#xff0c;支持歌曲搜索、歌手搜索及排行榜。软件支持歌曲下载、点歌、插队&#xff0c;还支持手机扫码点歌&#xff0c;功能与KTV软件一致&#xff0c;让用户在家也能享受KTV体验。首次加载较慢&#xff0c;因采用先下载后播放方式。会员版已…

图文深入介绍Oracle DB link(一)

1. 引言&#xff1a; 本文图文深入介绍Oracle DB link&#xff0c;先介绍基本概念。 2.DB link的定义 数据库链接&#xff08;Database Link&#xff0c;简称 DB Link&#xff09;是 Oracle 数据库中的一个重要功能。它是一种在一个 Oracle 数据库实例中访问另一个 Oracle 数…

江协科技STM32学习- P34 I2C通信外设

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

vxe-table 表格中实现多行文本的编辑

Vxe UI vue vxe-table 表格中实现多行文本的编辑 vxe-table v4.8 要在表格中使用多行文本编辑&#xff0c;可以通过设置行高方式&#xff0c;再设置 cell-config.verticalAlign: ‘top’ 单元格垂直对齐方式&#xff0c;实现顶部对齐&#xff0c;因为默认是居中对齐。 代码 …

Linux开发工具——make/Makefile

目录 一、什么是makefile&#xff1f; 二、为什么要有makefile&#xff1f; 三、makefile的使用 1.依赖关系与依赖方法 2.伪目标 3.定义变量 4.特殊符号 四、makefile的执行逻辑 一、什么是makefile&#xff1f; Makefile是一种自动化构建工具&#xff0c;make是一条指…

`掌握Python-PPTX,让PPt制作变得轻而易举!`

文章目录 掌握Python-PPTX&#xff0c;让PPT制作变得轻而易举&#xff01;背景介绍python-pptx 是什么&#xff1f;如何安装 python-pptx&#xff1f;简单库函数使用方法应用场景常见Bug及解决方案总结 掌握Python-PPTX&#xff0c;让PPT制作变得轻而易举&#xff01; 背景介绍…

uniapp vue3 使用echarts-gl 绘画3d图表

我自己翻遍了网上&#xff0c;以及插件市场&#xff0c;其实并没有uniapp 上使用echarts-gl的样例&#xff0c;大多数都是使用插件市场的echarts的插件 开始自己尝试直接用echartsgl 没有成功&#xff0c;后来尝试使用threejs 但是也遇到一些问题&#xff0c;最后我看官网的时…

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576

问题描述 我目前的环境是&#xff1a; 编辑器&#xff1a; Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例&#xff0c;只不过我想用c语言执行这个样例。在执行的过程中报错如下图&#xff1a; C4576 后跟初始值设定项列表的带圆括…

Moore Perf System 1.1版本

Moore Perf System&#xff08;一款性能分析工具&#xff09; 提供可视化界面&#xff0c;在时间轴上按时间顺序显示 CPU 和 GPU 的事件、吞吐和性能指标&#xff0c;帮助开发人员方便、快速、准确的定位到系统级别的性能瓶颈&#xff0c;进而进行针对性分析和优化&#xff0c;…

『VUE』19. scope避免组件之间样式互相覆盖(详细图文注释)

目录 使用多个组件带有样式分析如何避免css覆盖总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 使用多个组件带有样式 ComPonent1.vue <template><h3>ComPonent1.vue</h3> </template><script&g…

数据结构 C/C++(实验二:栈)

&#xff08;大家好&#xff0c;今天分享的是数据结构的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 提要&#xff1a;实验题目 一、实验目的 二、实验内容及要求 三、算法思想 实验1 实验2 四、源程序及注释…

软考背诵笔记

计算机硬件组成 运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备&#xff0c;输出设备 中央处理单元&#xff08;CPU&#xff09; 控制器组成 指令寄存器&#xff08;IR&#xff09;:暂存cpu执行指令 程序计数器&#xff08;PC&#xff09;:存放下一条执…

面试问答-1

目录 1、线程和进程的概念&#xff0c;区别、以及什么时候用线程什么时候用进程 1.1 概念 1.2 区别 1.3 选择 2、TCP/IP分几层&#xff0c;每层的核心任务是什么 1.tcp/ip模型 tcp&#xff1a; udp&#xff1a; tcp、udp的区别 tcp/udp的连接过程&#xff1a; 3、htt…

矩阵特殊打印方式

小伙伴们大家好&#xff0c;好几天没更新了&#xff0c;主要有个比赛。从今天起继续给大家更新&#xff0c;今天给大家带来一种新的题型&#xff1a;矩阵特殊打印方式。 螺旋打印矩阵 解题思路 首先给大家看一下什么是螺旋方式打印&#xff1a; 就像这样一直转圈圈。 我想大多…

Docker篇(Docker安装)

目录 一、Centos7.x 1. yum 包更新到最新 2. 安装需要的软件包 3. 设置 yum 源为阿里云 4. 安装docker 5. 安装后查看docker版本 6. 设置ustc镜像源 二、CentOS安装Docker 前言 1. 卸载&#xff08;可选&#xff09; 2. 安装docker 3. 启动docker 4. 配置镜像加速 …

计算机网络——路由器构成

算路由表是分布式去算——你算你的&#xff0c;我算我的 输出队列非先来先传 调度发生在哪里 缓存队列一般是应对——来数据方向的速度过快问题

C# 实现读取Excel文件并设置单元格计算公式再保存

背景&#xff1a;需求需要读取数据导出成Excel文件&#xff0c;并且其中有一列需要赋值为公式&#xff0c;用于用户自己修改数据自动计算 导出Excel&#xff0c;我用到开源包MiniExcel Gitee地址MiniExcel源码介绍&#xff0c;功能说明 Nuget安装 搜索MiniExcel 导出代码如下&a…

基于matlab的SVPWM逆变器死区补偿算法仿真研究

背景介绍&#xff1a; 三相脉宽调制(pulse width modulation&#xff0c;PWM)电压源逆变器(voltage source inverter&#xff0c;VSI)的死区效应可导致电机相电压和相电流畸变、零电流钳位效应以及转矩和转速脉动&#xff0c;系统性能降低。为提高系统运行性能&#xff0c;对V…

Spring Validation数据校检

文章目录 Spring Validation1 关于Spring Validation2 使用流程3 快速入门4 运行异常处理4.1 说明4.2 处理异常4.3 明确提示消息 5 常用注解5.1 NotNull注解5.2 NotEmpty 注解5.3 NotBlank 注解5.4 Size 注解5.5 Range 注解 6 非POJO参数校验6.1 使用流程6.2 使用示例 Spring V…

2024数据库国测揭晓:安全与可靠的新标准,你了解多少?

2024年数据库国测的结果&#xff0c;于9月份的最后一天发布了。 对于数据库行业的从业者来说&#xff0c;国测是我们绕不过去的坎儿。那么什么是国测&#xff1f;为什么要通过国测&#xff0c;以及国测的要求有哪些&#xff1f; 这篇文章带大家一探究竟。 国测 自愿平等、客…