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

这篇具有很好参考价值的文章主要介绍了提升Element UI分页查询用户体验与交互:实现修改未保存提示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        可以搭配食用:Element UI 实战:跨页保存表格选中状态与判断状态可选性的高效方案

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

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

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

提升Element UI分页查询用户体验与交互:实现修改未保存提示,前端,前端,elementui,vue.js

提升Element UI分页查询用户体验与交互:实现修改未保存提示,前端,前端,elementui,vue.js

动态演示 

      提升Element UI分页查询用户体验与交互:实现修改未保存提示,前端,前端,elementui,vue.js

实现

监听用户修改表单

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

 <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();
      }
    }
  }

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

提升Element UI分页查询用户体验与交互:实现修改未保存提示,前端,前端,elementui,vue.js

 恢复分页组件状态

        又从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分页查询用户体验与交互:实现修改未保存提示,前端,前端,elementui,vue.js

         感觉只能去修改 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();
        }
      }
    },

        最终达到想要的效果:

提升Element UI分页查询用户体验与交互:实现修改未保存提示,前端,前端,elementui,vue.js文章来源地址https://www.toymoban.com/news/detail-634056.html

到了这里,关于提升Element UI分页查询用户体验与交互:实现修改未保存提示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue使用Element-UI实现分页效果

    分页在展示数据列表的场景肯定是非常多的。 一般的项目开发中,数据量特别大,一般都是后端接口直接处理分页返回,前端直接调用即可。 但是前端也是可以不需要借助后端,自己也是可以处理分页的。今天我这个后端开发就站在前端的角度上,处理列表分页。 友情提示

    2024年02月02日
    浏览(44)
  • vue搭配element-ui前端实现表格分页

    如果不从后台请求数据,那么就需要在前端手动管理数据。可以使用以下步骤实现该功能: 在 Vue 组件的 data 中定义一个数组来存放所有数据(不分页)。 在 mounted 钩子函数中,手动获取数据并存放到上一步定义的数组中。 在模板中使用 element-ui 的表格组件来展示数据,同

    2024年02月11日
    浏览(44)
  • vue使用element-ui实现分页功能

    element-ui官网上有分页实现的功能,简单方便又好用,也有很多分页的样式,你可以根据需要去选择自己想要的样式。这里讲的是完整功能样式的一个分页实现。过程如下: 分页方法完成。

    2024年02月13日
    浏览(43)
  • 如何实现element ui中的表格全部数据分页排序

    默认情况下, table表格设置了sortable是只能当前页, 数据进行排序的, 这显然是没有多大意义的 ,那么如何实现全部数据分页排序呢? 首先 ,把sortable 写成sortable=“custom” 然后,在 el-table标签中加入 @sort-change=\\\'sortChange\\\' 最后 ,sortChange方法代码如下: sortChange(val){      

    2024年02月11日
    浏览(41)
  • Vue.js 中使用 Element UI 实现异步加载分页列表

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

    2024年02月04日
    浏览(55)
  • 【分页表格】Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)

    这篇文章,主要介绍Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)。 目录 一、分页表格 1.1、运行效果 1.2、运行环境 1.3、案例代码

    2024年02月11日
    浏览(55)
  • element-ui中的el-table实现分页多选功能

    selection-change事件:当选择项发生变化时会触发该事件(当分页切换时,选中的数据都会自动清空) 链接: https://blog.csdn.net/qq_36157085/article/details/122922678

    2024年02月17日
    浏览(45)
  • element-ui在table分页的情况下实现多页筛选(单列/多列)

    element-ui官网提供的筛选样例只能对当前页的数据进行筛选,但我们用它提供的filter-change事件和column-key属性来实现多页筛选 在element-ui官网提供的筛选样例的基础上, el-table 标签上 加 @filter-change=\\\"filterChange\\\" 在要筛选的那一列的 el-table-column 标签上 加 column-key=\\\"tag\\\" 去掉 el-tab

    2023年04月09日
    浏览(31)
  • 基于Vue和Element UI实现前后端分离和交互

    目录 前言 一、Element UI简介 1.Element UI是什么 2.Element UI的特点 二、项目搭建 1.创建一个SPA项目 2.安装 Element-UI 3.导入组件 4.创建登陆注册界面 登录组件---Login.vue 注册组件---Register.vue 定义组件与路由的对应关系 效果演示:  三、前后端数据交互 1.安装axios 2.导入api模块,添加

    2024年02月08日
    浏览(50)
  • Vue+Element-UI 实现前端分页功能,利用el-table和el-pagination组件实现表格前端分页

    Vue+Element-UI 实现前端分页功能,利用el-table和el-pagination组件实现表格前端分页:         当table的数据量比较大的时候,一个屏幕展示不出全部的数据,这个时候就需要分页显示。而多数情况下都是做的后端分页,就是将分页参数和查询条件一并传到后端,后端将当前页要

    2024年01月20日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包