当前位置: 首页 > news >正文

Vue3 中使用 Sortablejs 实现拖拽排序功能 序号不更新问题

Vue3 中使用 Sortablejs 实现拖拽排序功能 序号不更新问题

  1. 安装依赖
  npm install sortablejs --save
  1. 简单使用
<template>
  <div class="app-container">
    <div class="table-header">
      <el-button type="primary" @click="handleAdd">添加</el-button>
    </div>
    <el-table :data="tableData" row-key="code">
      <el-table-column width="50">
        <template #default>
          <el-icon class="drag-handle"><Operation /></el-icon>
        </template>
      </el-table-column>
      <el-table-column label="序号" width="80" align="center">
        <template #default="scope">{{ scope.$index + 1 }}</template>
      </el-table-column>
      <el-table-column prop="name" label="名称"></el-table-column>
    </el-table>
  </div>
</template>

<script setup>
import { ref, onMounted, nextTick } from 'vue'
import Sortable from 'sortablejs'

const tableData = ref([
  { code: 1, name: '项目1' },
  { code: 2, name: '项目2' },
  { code: 3, name: '项目3' }
])

// 添加数据方法
const handleAdd = () => {
  const newData = {
    code: Date.now(),
    name: '新项目' + (tableData.value.length + 1)
  }
  tableData.value.push(newData)
}

// 记录滚动位置
const scrollTopTemp = ref(0)

onMounted(() => {
  const el = document.querySelector('.el-table__body-wrapper tbody')
  if (!el) return
  
  Sortable.create(el, {
    handle: '.drag-handle',  // 拖拽句柄
    animation: 150,  // 动画过渡时间
    onEnd({ newIndex, oldIndex }) {
      const currRow = tableData.value.splice(oldIndex, 1)[0]
      tableData.value.splice(newIndex, 0, currRow)
    }
  })
})
</script>

<style scoped>
.table-header {
  margin-bottom: 20px;
}

.drag-handle {
  cursor: move;
  font-size: 20px;
  color: #909399;
}

:deep(.el-table__row) {
  cursor: move;
}
</style>
  1. 有时因为嵌套原因,或者循环创建会造成 序号不更新的情况 解决方法如下
    onEnd({ newIndex, oldIndex }) {
      const listTemp = [...tableData.value]
      const currRow = listTemp.splice(oldIndex, 1)[0]
      listTemp.splice(newIndex, 0, currRow)
      
      // 使用 nextTick 确保数据更新后再设置滚动位置
      tableData.value = []
      nextTick(() => {
        tableData.value = listTemp
      })
    }
  1. 该方法会解决序号刷新问题 但是会造成表格重置 导致 滚动条回到顶部 解决如下
  Sortable.create(el, {
    handle: '.drag-handle',  // 拖拽句柄
    animation: 150,  // 动画过渡时间
    onStart() {
      // 记录滚动位置
      // 这里需要注意你的滚动元素 是那个 我的是html标签 
      scrollTopTemp.value = document.documentElement.scrollTop
    },
    onEnd({ newIndex, oldIndex }) {
      const currRow = tableData.value.splice(oldIndex, 1)[0]
      tableData.value.splice(newIndex, 0, currRow)
      
      // 使用 nextTick 确保数据更新后再设置滚动位置
      tableData.value = []
      nextTick(() => {
        tableData.value = listTemp
        nextTick(() => {
         // 这里需要注意你的滚动元素 是那个 我的是html标签 
          document.documentElement.scrollTop = scrollTopTemp.value
        })
      })
    }
  })
  1. 注意: 弹窗中的表格拖拽 请在 每次弹窗打开后面进行初始化。

  2. 完成!

相关文章:

  • OPPO手机如何实时翻译会议视频?视频翻译轻松应对多语言场景
  • 协议学习——1 NCDSSB
  • 【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典
  • [从零开始学习JAVA] 初识多线程
  • 【Kafka】Kafka生产者如何实现冥等的?
  • Llama3大模型本地部署与调用
  • Ansible内置模块之package
  • xdoj回忆练
  • Maven工具学习使用(二)——Maven基础用法
  • 海思烧录工具HITool电视盒子刷机详解
  • “征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)
  • 【CUDA】mnist_cuda
  • MySQL 索引详解
  • Axure设计之中继器表格——拖动列调整位置教程(中继器)
  • 力扣14. 最长公共前缀:Java四种解法详解
  • const count = ref(0);是什么意思。count最终会是什么值
  • 矩阵篇---矩阵的应用
  • 棱镜七彩受邀出席“供应链安全国家标准贯标应用深度行”活动并做主题分享
  • 动态IP与静态IP该如何选?
  • 什么是矩阵账号
  • 做网站电话/网站域名综合查询
  • wordpress外网跳转/知乎关键词排名优化工具
  • 大连网站搜索优/宁波seo网络推广
  • 自己的网站怎么做的/抖音搜索排名
  • 上海网站建设网站制/推广品牌的方法
  • 建站快车帮助/百度快照投诉中心官网