首页 > 其他分享 >表格数据拖拽排序 sortable.js

表格数据拖拽排序 sortable.js

时间:2023-11-14 14:13:20浏览次数:32  
标签:pageNum pageSize js 数组 sortable 页面 拖拽 赋值

需求

拖拽表格的行数据,实现排序。

问题

拖拽后调用接口,但视图没变,还是原来的顺序

场景:拖拽表格行数据后,tableDataArr 中数据的 orderNum 值会改变,实现拖拽换序。

期望情况:页面根据更改后的 orderNum 重新排序。

实际情况:接口数据变了,但是页面行数据没有改变。也就是说,页面没有实现响应式更新。

尝试1:使用 $set 赋值,无效。

	// 旧代码:
      this.tableDataArr = arr.slice(
        (this.pageNum - 1) * this.pageSize,
        this.pageNum * this.pageSize
      );
	// 新代码:无效
      this.$set(this, 'tableDataArr', arr.slice(
        (this.pageNum - 1) * this.pageSize,
        this.pageNum * this.pageSize
      ))

尝试2:赋值后使用 this.$forceUpdate() 强制更新,无效

尝试3:使用 splice() 赋值

      const newArr =  arr.slice((this.pageNum - 1) * this.pageSize,this.pageNum * this.pageSize)
      this.tableList.splice(
        0,
        this.tableList.length,
        ...newArr
      );

解决:赋值前先重置数组

      // 重置 tableList,避免换序不更新页面
      this.tableList = [];
	  // 赋值
      this.tableDataArr = arr.slice(
        (this.pageNum - 1) * this.pageSize,
        this.pageNum * this.pageSize
      );

原因

sortable.js 拖拽排序是插入,即把A插入到B之前或之后。拖拽(页面数据顺序改变了但数组没变)后,再调用换序接口,获得的数组变了,但没有引起视图的变化。

这是因为 Vue 无法监听数组顺序的改变。

拖拽方向不同,导致被替换行不同(测试需从不同拖拽方向测试)

  • 拖拽行 A
  • 插入行 B
  • 被替换行

备注:oldIndex 指的是 A 原来的位置,newIndex 指的是 A 拖拽后的位置。

情况一:oldIndex < newIndex

  • A 拖到B 后面,A 取代了 B 原来的位置;
  • A 拖到B 前面,A 取代了 B 前一个属性,即C 原来的位置;

image

情况二:oldIndex > newIndex

  • A 拖到B 后面,A 取代了 B 后一个属性,即C 原来的位置;
  • A 拖到B 前面,A 取代了 B 原来的位置;

image

如何修改放置行的背景色

ghostClass属性:颜色名。若为空字符串表示无颜色。

image

如何限制可拖拽的区域、可放置区域

filter 属性:可拖拽的元素
image

onMove 限制可放置区域
image

      Sortable.create(tbody, {
        filter: ".common-row", // 继承属性不可拖拽
	……
        // 不允许拖拽到继承属性区域中
        onMove(e) {
          return e.related.className.indexOf("common-row") === -1;
        },
      });

参考链接:

  1. vue2.0中给对象或者数组重新赋值并且保证响应式
  2. 数组的侦听
  3. sortable.js配置项

标签:pageNum,pageSize,js,数组,sortable,页面,拖拽,赋值
From: https://www.cnblogs.com/shayloyuki/p/17815248.html

相关文章

  • app直播源代码,JS 替换日期的横杠为斜杠
    app直播源代码,JS替换日期的横杠为斜杠例如1:   vardt="2010-01-05";      vardt=dt.replace("-","/");    //只替换第一个“-”:2010/01-05  alert(dt); ​例如2:   vardt="2010-01-05";     vardt=dt.replace(/-/g,"/&q......
  • 原生JS上传大文件分片
    上传大文件分片是一种常见的上传方式,可以有效地避免上传过程中出现网络中断等问题导致的上传失败。下面是一个使用原生JS实现上传大文件分片的示例代码: javascript//定义上传文件的分片大小constCHUNK_SIZE=1024*1024;//1MB//获取文件的MD5值functiongetFi......
  • VSCode 中 Json 文件介绍
    VisualStudioCode官方文档1.Json配置文件EditingJSONwithVisualStudioCodesettings.json分类defaultsettings.json:只读格式,相当于官方的参考文档;settings.json:自定义形式,优先级大于默认的settings.json文件,ctrl+shift+o查看默认提供的格式,而后自定......
  • js:React中使用classnames实现按照条件将类名连接起来
    参考文档https://www.npmjs.com/package/classnameshttps://github.com/JedWatson/classnames安装npminstallclassnames示例importclassNamesfrom"classnames";//字符串合并console.log(classNames("foo","bar"));//foobar//对象合并console.lo......
  • js:可选链运算符(?.)和空值合并运算符(??)
    文档:可选链运算符(?.)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining空值合并运算符(??)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing目录1、可选链运算符(?.)2、空值合并运算......
  • 基于React使用swiperjs实现竖向滚动自动轮播
    很多文章,都只提供了js部分,包括官方的文档也只有js部分,如果css设置不正确,会导致轮播图不自动播放。使用的swiper版本:v11.0.3文档https://swiperjs.com/get-startedhttps://swiperjs.com/react实现效果使用vite创建react应用pnpmcreatevitereact-app--templatereact完整依赖pac......
  • js运行机制
    区分进程和线程线程和进程区分不清,是很多新手都会犯的错误,没有关系。这很正常。先看看下面这个形象的比喻:进程是一个工厂,工厂有它的独立资源工厂之间相互独立线程是工厂中的工人,多个工人协作完成任务工厂内有一个或多个工人工人之间共享空间再完善完善概念:工......
  • vuejs3.0 从入门到精通——Pinia——Store 是什么?
    Pinia——Store是什么?https://pinia.vuejs.org/zh/getting-started.html#what-is-a-store一、Store是什么? Store(如Pinia)是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。......
  • js实现大文件分片上传
    简单的实现一个分片上传//设置分片大小(大小根据需求调整)constCHUNK_SIZE=1024*1024;//1MB//选择文件并切割成分片constfileInput=document.getElementById('file-input');constchunks=[];letcurrentChunkIndex=0;fileInput.addEventListener('change',hand......
  • js---判断用户是否在浏览当前页面
    最近遇到一个需求,需要判断用户是否在当前页面,只有用户在当前页面才可以播放视频,如果切换到其他窗口就要将视频暂停掉,避免学生刷课程,以下是具体的代码:<scripttype="text/javascript"src="js/jquery-1.8.3.min.js"></script><scripttype="text/javascript">varindex=0,ti......