提升Element UI分页查询用户体验与交互:实现修改未保存提示

news2024/11/23 20:20:14

        我实现的功能是在 element ui 的分页组件中进行分页查询时,如果当前有未保存的修改数据就提示用户,用户可以选择是否放弃未保存的数据。确认放弃就重新查询数据;选择不放弃,不重新查询,并且显示条数选择框保持原样(选择框中文字与选择列表中选择项),页数跳转也是同样的功能。

例子说明:当我们修改了表单某项数据但未保存时。
        更改每页显示条数:我们点击显示条数选择框的 '20条/页',此时会弹出一个提示如图。选择确定就重新查询渲染,未保存数据就丢失了;选择取消的话,不重新查询,并且显示条数保持 '10条/页',打开选择列表也是 '10条/页'。

        页数跳转:我们点击第二页或者下一页按钮,同样跳出提示如图,选择确定就重新查询渲染,未保存数据就丢失了;选择取消的话,不重新查询,并且仍然选中的是第一页。

动态演示: 

      

        首先我们要如何判断用户修改了表单呢?我采用的方法是在查询数据时,深拷贝一份返回的数组数据。然后在分页改变时对比两者。

 <el-pagination
    @size-change="handleSizeChange"
    @current-change="handlePageChange"
    :current-page.sync="currentPage"
    :page-sizes="[10, 20, 40, 80]"
    :page-size="pageSize"
    :total="totalCount"
    layout="sizes, prev, pager, next"
  >
  </el-pagination>
 data() {
    return {
      currentPage: 1,
      cachedPage: 1,
      pageSize: 10,
      cachedPageSize: 10,
      totalCount: 0,
      loading: false, // 是否显示加载中
      originalData: [],
      formData: {
        tableData: [],
        rules: {}
      }
    }
  },
  methods: {
    handleSizeChange(val) {
      if (!this.isEqual()) {
        this.$confirm("当前有未保存数据,确定要继续吗?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(() => {
          this.cachedPageSize = val;
          this.pageSize = val;
          this.getData();
        }).catch(() => {
          this.pageSize = this.cachedPageSize;
        })
      } else {
        this.cachedPageSize = val;
        this.pageSize = val;
        this.getData();
      }
    },
    handlePageChange(val) {
      if (!this.isEqual()) {
        this.$confirm("当前有未保存数据,确定要继续吗?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(() => {
          this.cachedPage = val;
          this.currentPage = val;
          this.getData();
        }).catch(() => {
          this.currentPage = this.cachedPage;
        })
      } else {
        this.cachedPage = val;
        this.currentPage = val;
        this.getData();
      }
    },
    // 判断表单数据是否改变
    isEqual() {
      for (let i in this.formData.tableData) {
        const obj = this.formData.tableData[i];
        for (let key in obj)
          if (obj[key] === "") obj[key] = null; 
          // 属性值为null经过修改再删除会变为"",故将两者看做相等
      }

      const newData = this.formData.tableData.map((obj) => {
        const newObj = Object.assign({}, obj);
        delete newObj.changed; // changed是告诉后端那些项修改了 对比时要删除
        return newObj;
      })

      return JSON.stringify(newData) === JSON.stringify(this.formData.tableData);
    },

    async getData() {
      const isLoading = this.loading("加载中");
      const params = {
        page: this.currentPage,
        page_size: this.pageSize
      }
      const { code, data, count } = await getDataList(params); // 请求列表数据
      if (code == 200) {
        this.originalData = JSON.parse(JSON.stringify(data));
        this.$set(this.formData, "tableData", data);
        this.totalCount = count;
        isLoading.close();
      }
    }
  }

        这样修改后,页数跳转可以恢复原来的页数,但是 '条/页' 没有恢复。

         又从F12里查找对应 dom 元素尝试进行修改,获取 el-pagination 的引用,并且给分页选择框加上类属性 one 来方便获取。    

 <el-pagination
    ref="pagination"
    @size-change="handleSizeChange"
    @current-change="handlePageChange"
    :current-page.sync="currentPage"
    :page-sizes="[10, 20, 40, 80]"
    :page-size="pageSize"
    :total="totalCount"
    layout="sizes, prev, pager, next"
    :popper-class="'one'"
    >
  </el-pagination>



.catch(() => {
          this.pageSize = this.cachedPageSize;
          const pagination = this.$refs.pagination;
          const select = pagination.$el.querySelector(".one .el-input__inner");
          select.value = `${this.cachedPageSize}条/页`;

          const ul = document.querySelector(".el-select-fropdown__list");

          const fn = () => {
            const lis = ul.querySelectorAll("li");
            lis.forEach(li => {
              li.classList.remove("selected");
            })

            const arr = [10, 20, 40, 80];
            let index = arr.indexOf(this.pageSize);
            let changedLi = lis[index];
            changedLi.classList.add("selected");
          }
          fn();

          ul.addEventListener("mouseover", fn);
        })

        结果显示看着是符合的,但是选择 '20条/页' 后取消,应该是 '10条/页' 无法点击,'20条/页' 可以点击,但是结果是 '10条/页' 可以点, '20条/页' 无法点,即虽然改变了样式,但是 element ui 仍然认为我们点击了 '20条/页',现在处于 '20条/页'。

         感觉只能去修改 element ui 的源码逻辑了,否则无法满足我的需求;要么就自己写一个分页组件。这时,我突然想到正常的每页显示条数我们每次点击后,不是会自己自动跳转到对应的 '条/页' 吗。于是想到了我直接将对应原来的 '条/页' 的 li 标签触发一次 click ,然后跳过提示弹框与重新请求数据不就好了吗?

data中新增 changedFlag: false,


handleSizeChange(val) {
      if (!this.changedFlag && !this.isEqual()) {
        this.$confirm("当前有未保存数据,确定要继续吗?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        }).then(() => {
          this.cachedPageSize = val
          this.pageSize = val
          this.getData()
        }).catch(() => {
          this.pageSize = this.cachedPageSize;

          const ul = document.querySelector(".one .el-select-fropdown__list");
          const lis = ul.querySelectorAll("li");
          const arr = [10, 20, 40, 80];
          let index = arr.indexOf(this.pageSize);
          let changedLi = lis[index];
          this.changedFlag = true;
          changedLi.click();
        })
      } else { // 判断是否是changedLi触发click
        if (this.cachedPageSize == val) {
          this.changedFlag = false;
          this.pageSize = val
        }
        else {
          this.changedFlag = false;
          this.cachedPageSize = val;
          this.pageSize = val;
          this.getData();
        }
      }
    },

        最终达到想要的效果:

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

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

相关文章

AWS中lambda与DynamoDB的集成

前言&#xff1a;我在整个集成过程中&#xff0c;存在最大的问题有两个&#xff0c; 1. 没有考虑到lambda函数的权限&#xff0c;即对DynamoDB或者其他如Kinesis的权限授权&#xff0c;导致无法写入或者读取。 2.最初使用了异步方式调用&#xff0c;导致无法写数据到DynamoDB…

STM32自带的DSP库的滤波初体验(一)

最近在弄STM32自带的DSP库里的滤波&#xff0c;记录一下&#xff1a; arm_fir_instance_q15 instance_q15_S; #define NUM_TAPS 16 //滤波系数的个数 #define BLOCK_SIZE 32 q15_t firStateF32[BLOCK_SIZE NUM_TAPS]; q15_t Fir_Coeff[NUM_TAPS] {-79, -136, 312, 6…

《合成孔径雷达成像算法与实现》Figure3.1

代码复现如下&#xff1a; clc close all clear all%参数设置 B 5.80e6; %信号带宽 T 7.26e-6; %脉冲持续时间 K B/T; %线性调频频率 alpha 5; %过采样率 F alpha*B; %采样频率 N F*T; %采样点数 dt T/N; …

85. 最大矩形

题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1…

Icon图标有哪些在线设计的工具推荐

虽然icon图标相对较小&#xff0c;但icon图标在设计中非常重要。高质量的icon图标通常可以决定设计工作的质量。高质量的在线生产icon工具可以提高设计师图标设计的效率。此外&#xff0c;优秀的图标设计师还可以让设计师快速开始图标设计工作。本文为您选择了五种在线生成icon…

python ffmpeg合并ts文件

当你从网站下载了一集动漫&#xff0c;然后发现是一堆ts文件&#xff0c;虽然可以打开&#xff0c;但是某个都是10秒左右&#xff0c;很不方便。 这时&#xff0c;可以用python合并ts文件。 &#xff08;1&#xff09;安装配置ffmpeg 官网下载ffmpeg-2023-08-07-git-d295b6b…

【工作中问题解决实践 十】一次内存泄露排查-MAT使用指南

最近体验了一把当医生的感觉&#xff0c;定位病根病因&#xff0c;感觉这种要揪出问题的感觉很爽&#xff0c;并不觉得麻烦&#xff0c;这里将整个排查过程记录一下&#xff0c;方便之后再遇到类似问题有应对之道。 问题背景 2023-07-18 早上还在睡梦中的俺被一条条报警消息铛…

CTF流量题解http1.pcapng

使用Wireshark工具打开流量文件http1.pcapng&#xff0c;如下图所示。 在过滤检索栏输入http&#xff0c;wireshark自动进行过滤。

【EI复现】基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

太水了,4年经验还不如一年的,难怪面试过不了

前言 看到朋友圈一个HR发的招聘信息&#xff0c;招聘2名外包测试开发岗位&#xff0c;如果只会pythonpytestrequest这种基础的测开技术&#xff0c;极大概率是过不了面试的。 一方面为她发的信息所惊讶&#xff0c;因为外包的岗位一般在我们看来薪资不高且要求较低&#xff1…

IPC之二:使用命名管道(FIFO)进行进程间通信的例子

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本文主要介绍命名管道(FIFO)&#xff0c;命名管道可以完成同一台计算机上的进程之间的通信&#xff0c;本文给出了多个具体的实例&#xff0c;每个实例均附有完整的源代码&#xff1b;本文所有实例在 …

axios接受文件流并下载

需求场景 前端发送请求&#xff0c;后端传回文件流&#xff0c;前端接受到后立刻打开下载窗口下载文件 注意事项 请求api需要添加&#xff1a;responseType:blob&#xff0c; axios拦截器拦截错误状态码 (假设是code) 那里的if从res.code ! 200改为res.code && res.…

SSD202D-kernel-uimage后面加入dtb

情况是这样的,由于我们这边烧录的是uImage.xz 是经过压缩的uimage文件,涉及到解码,boot获取dtb会需要解码,解码不知为何会延时十几秒等待 这是万万不能的,于是就使用了别的方法就把dtb放到kernel的空间多余的地方,这样只要能读到即可 于是我开始了设计方法 可以看到这个dtb的…

以mod_jk方式整合apache与tomcat(动静分离)

前言&#xff1a; 为什么要整合apache和tomcat apache对静态页面的处理能力强&#xff0c;而tomcat对静态页面的处理不如apache&#xff0c;整合后有以下好处 提升对静态文件的处理性能 利用 Web 服务器来做负载均衡以及容错 更完善地去升级应用程序 jk整合方式介绍&#…

Sqlserver还原数据库为另外的名字

Sqlserver还原数据库为另外的名字 在工作中需要还原数据库的时候原来的数据库不变&#xff0c;而是需要还原成一个新的数据库 1、备份test数据库 2、新建一个test1数据库 3、设置test1数据库文件的权限 右键这两个文件->属性 4、在test1上还原数据库 5、数据库还原配置…

比特鹏哥5-数组【自用笔记】

比特鹏哥5-数组【自用笔记】 1.数组的概念2.一维数组的创建和初始化创建的语句结构初始化的语句结构 3.一维数组的使用数组的下标&#xff1a;从0开始&#xff0c;n个数组&#xff0c;最后一个的下标是n-1 4.一维数组在内存中的存储5.sizeof计算数组元素个数可以计算元素个数并…

守住L2?争夺高阶智驾?留给外资Tier1的时间不多了!

14.08%&#xff0c;这是2023年1-6月中国市场&#xff08;不含进出口&#xff09;乘用车前装标配L2&#xff08;含L2&#xff09;搭载中国本土系统解决方案的份额占比。而在NOA等高阶赛道&#xff0c;中国本土势力已经占据上风。 这个过去一直被外资Tier1垄断的智能化细分市场&a…

机器学习深度学习——循环神经网络RNN

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习—语言模型和数据集 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助…

JDBC处理批量数据提高效率

文章目录 0 说明1 如何使用jdbc操作数据库1.1 加载数据库驱动1.2 建立数据库连接1.3 创建Statement或者PreparedStatement用来执行SQL1.4 开始执行SQL语句1.5 处理结果集1.6 关闭连接1.7 完整代码 2 批量操作数据库3 如何打印SQL语句4 jdbc常用开源类库5 获取自增id6 获取数据源…

【CSS】网格布局(简单布局、网格合并、网格嵌套)

文章目录 CSS网格布局&#xff08;Grid Layout&#xff09;1. 简单布局2. 网格合并3. 网格嵌套4. 总结 CSS网格布局&#xff08;Grid Layout&#xff09; CSS网格布局&#xff08;Grid Layout&#xff09;是一种强大且灵活的CSS布局系统&#xff0c;允许开发者以网格形式组织和…