vue2&vue3 el-table实现整行拖拽排序功能(使用sortablejs插件)

这篇具有很好参考价值的文章主要介绍了vue2&vue3 el-table实现整行拖拽排序功能(使用sortablejs插件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、此功能已集成到[TTable组件中]—Vue2TTable组件 、Vue3TTable组件

2、最终效果

vue2&vue3 el-table实现整行拖拽排序功能(使用sortablejs插件)

3、安装sortablejs

npm install sortablejs --save

4、Vue2实现方式

<template>
 <el-table
      ref="el-table"
      :data="tableData"
      :class="{'cursor':isCopy,'row_sort':isRowSort,'highlightCurrentRow':highlightCurrentRow,'radioStyle':(table.firstColumn&&table.firstColumn.type==='radio'),'treeProps':isShowTreeStyle}"
      v-bind="$attrs"
      v-on="$listeners"
      :highlight-current-row="highlightCurrentRow"
      :border="table.border||isTableBorder"
      :span-method="spanMethod||objectSpanMethod"
      :cell-class-name="cellClassNameFuc"
      @sort-change="soltHandle"
      @row-click="rowClick"
      @cell-dblclick="cellDblclick"
    >
    ....
 	</el-table>
 </template>
 <script>
import Sortable from 'sortablejs'
 props: {
  	// table所需数据
    table: {
      type: Object,
      default: () => {
        return {}
      }
    },
 	// 是否开启行拖拽
    isRowSort: {
      type: Boolean,
      default: false
    }
    ...
},
data() {
    return {
      tableData: this.table?.data
    }
  },
  watch: {
    'table.data': {
      handler(val) {
        this.tableData = val
      },
      deep: true // 深度监听
    }
  },
mounted() {
    this.initSort()
  },
  methods: {
	    // 行拖拽
	    initSort() {
	      if (!this.isRowSort) return
	      const el = this.$refs['el-table'].$el.querySelector('.el-table__body-wrapper > table > tbody')
	      new Sortable(el, {
	        animation: 150, // 动画
	        onEnd: evt => {
	          const curRow = this.tableData.splice(evt.oldIndex, 1)[0]
	          this.tableData.splice(evt.newIndex, 0, curRow)
	          this.$emit('rowSort', this.tableData)
	        }
	      })
	    }
	}
</script>

5、Vue3实现方式

<template>
	<div class="t-table" ref="TTableBox">
	....
	 <el-table
      ref="TTable"
      :data="state.tableData"
      :class="{
        cursor: isCopy,
        row_sort: isRowSort,
        highlightCurrentRow: highlightCurrentRow,
        radioStyle: table.firstColumn && table.firstColumn.type === 'radio',
      }"
      v-bind="$attrs"
      size="default"
      :highlight-current-row="highlightCurrentRow"
      :border="table.border || isTableBorder"
      @cell-dblclick="cellDblclick"
      @row-click="rowClick"
      :cell-class-name="cellClassNameFuc"
    >
    ....
	</el-table>
  </div>
</template>
<script setup lang="ts">
import { computed, ref, watch, useSlots, reactive, onMounted } from 'vue'
import Sortable from 'sortablejs'
const props = defineProps({
 // table所需数据
  table: {
    type: Object,
    default: () => {
      return {}
    },
    required: true,
  },
   // 表头数据
  columns: {
    type: Array,
    default: () => {
      return []
    },
    // required: true
  },
   // 是否开启行拖拽
  isRowSort: {
    type: Boolean,
    default: false,
  }
  ...
})
// 初始化数据
const state = reactive({
  tableData: props.table.data,
  ...
})
// 获取el-table ref
const TTable: any = ref<HTMLElement | null>(null)
// 获取t-table ref
const TTableBox: any = ref<HTMLElement | null>(null)
// 抛出事件
const emits = defineEmits([
  'rowSort',
   ....
])
watch(
  () => props.table.data,
  (val) => {
    // console.log(111, val)
    state.tableData = val
  },
  { deep: true }
)
onMounted(() => {
  initSort()
})
// 行拖拽
const initSort = () => {
  if (!props.isRowSort) return
  const el = TTableBox.value.querySelector('.el-table__body-wrapper tbody')
  // console.log('3333', el)
  Sortable.create(el, {
    animation: 150, // 动画
    onEnd: (evt) => {
      const curRow = state.tableData.splice(evt.oldIndex, 1)[0]
      state.tableData.splice(evt.newIndex, 0, curRow)
      emits('rowSort', state.tableData)
    },
  })
}
</script>

注意事项,el-table需要配置row-key且保持唯一性,不然会出现排序不对的情况

6、sortablejs其他options配置

7、组件地址

Vue3组件地址

Vue2组件地址

8、相关文章

Vue2基于ElementUi再次封装基础组件文档

vue3+ts基于Element-plus再次封装基础组件文档文章来源地址https://www.toymoban.com/news/detail-476229.html

到了这里,关于vue2&vue3 el-table实现整行拖拽排序功能(使用sortablejs插件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【前端vue+elemenui】el-table根据表格数据设置整行样式或单元格样式

    首先需要了解俩个函数,row-class-name、cell-class-name 这里以cell-class-name单元格样式为例 row-class-name 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。 Function({row, rowIndex})/String cell-class-name 单元格的 className 的回调方法,也可以使用字符串为所有单元

    2024年01月24日
    浏览(52)
  • vue使用Element UI时,el-table表格整行操作单选禁选并隐藏全选框

    需求:表格复选修改为单选,只可选择一个;不满足条件的不可勾选;可进行整行操作 注意使用的方法. 需求由复选改为单选后, 左上角全选框要进行隐藏 ,复选框也变成单选框,这里是通过css样式进行调整的 勾选复选框的select和整行操作的row-click可以共用同一个方法,

    2024年02月13日
    浏览(47)
  • vue3中el-table实现表格合计行

    el-table标签上加属性 show-summary :summary-method=“getSummary” js中添加函数(合计没有额外的附件参数添加) js中添加函数(合计有额外的附件参数添加的情况)

    2024年02月02日
    浏览(50)
  • Vue2+ElementUI的el-table实现新增数据行与删除的功能

    TableIndex.vue 如下 新增 按钮添加数据行 删除 按钮提示是否继续删除

    2024年04月23日
    浏览(44)
  • Vue中el-table表格的拖拽排序

    element-ui 表格没有拖拽排序的功能,只能使用sortable.js插件实现拖拽排序,当然也可以应用到其他的组件里面,用法类似,这里只说表格。 实现步骤: 1、安装sortable.js 2、在需要的页面中引入 3、实现表格拖动代码

    2024年02月10日
    浏览(51)
  • vue3中el-table实现多表头并表格合并行或列

    1、el-table中添加事件 :span-method=\\\"genderSpanCity\\\" 2、js添加函数 效果图为

    2024年01月23日
    浏览(55)
  • Vue3 el-table 单选

    解决方式:给每个表格加上唯一key值

    2024年02月11日
    浏览(52)
  • el-table(vue2中)滚动条被固定列盖住

      vue2 + el-table         1、现场图片:                          2、全局css环境配置了滚动条高度为 6px         3、el-table设置滚动条为 15px (比全局高9px) el-table固定列(是根据全局滚动条高度计算,导致覆盖掉滚动条9px,只显示6px) 改变el-table固定列的计算

    2024年02月07日
    浏览(41)
  • vue2 el-table行悬停时弹出提示信息el-popover

    实现方法,用到了cell-mouse-enter、cell-mouse-leave两个事件,然后在表格的首列字段中,加个el-popover组件,当然你也可以选择在其他字段的位置来显示提示框,看自己的需求了。 示例代码: 在enter方法中,还可以根据row行数据进行一些处理,比如根据状态status来判断是否弹出提示

    2024年01月18日
    浏览(69)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包