vue插件实现表格拖拽 sortable 遇见的坑

简介: vue插件实现表格拖拽 sortable 遇见的坑

下载插件  npm install sortable.js --save (下载的时候一定要这样去下载,不要去下载    npm install sortable--save )


因为sortable.js和sortable是不一样的哈


引入      import Sortable from 'sortablejs';  


//   千万不要加点.js  否者就会报错create不是一个方法


注意  这个插件是不要注册的哈。


需要注意的是element table务必指定row-key,row-key必须是唯一的,如ID,不然会出现排序不对的情况。


参考的地址  https://blog.csdn.net/qq_26440803/article/details/83663511


为啥一开始就在mounted中调用了两个函数,不太懂?????


<template>
  <div style="width:800px">
    <el-table :data="tableData"
      border
      row-key="id"
      align="left">
     <el-table-column v-for="(item, index) in col"
        :key="`col_${index}`"
        :prop="dropCol[index].prop"
        :label="item.label"> 
      </el-table-column>
    </el-table>
  </div>
</template>


<script>
import Sortable from 'sortablejs'
export default {
  data() {
    return {
      col: [
        {
          label: '日期',
          prop: 'date'
        },
        {
          label: '姓名',
          prop: 'name'
        },
        {
          label: '地址',
          prop: 'address'
        }
      ],
      dropCol: [
        {
          label: '日期',
          prop: 'date'
        },
        {
          label: '姓名',
          prop: 'name'
        },
        {
          label: '地址',
          prop: 'address'
        }
      ],
      tableData: [
        {
          id: '1',
          date: '2016-05-02',
          name: '王小虎1',
          address: '上海市普陀区金沙江路 100 弄'
        },
        {
          id: '2',
          date: '2016-05-04',
          name: '王小虎2',
          address: '上海市普陀区金沙江路 200 弄'
        },
        {
          id: '3',
          date: '2016-05-01',
          name: '王小虎3',
          address: '上海市普陀区金沙江路 300 弄'
        },
        {
          id: '4',
          date: '2016-05-03',
          name: '王小虎4',
          address: '上海市普陀区金沙江路 400 弄'
        }
      ]
    }
  },
  mounted() {
    this.rowDrop()
    this.columnDrop()
  },
  methods: {
    //行拖拽
    rowDrop() {
      const tbody = document.querySelector('.el-table__body-wrapper tbody')
      const _this = this
      Sortable.create(tbody, {
        onEnd({ newIndex, oldIndex }) {
          const currRow = _this.tableData.splice(oldIndex, 1)[0]
          _this.tableData.splice(newIndex, 0, currRow)
        }
      })
    },
    //列拖拽
    columnDrop() {
      const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
      this.sortable = Sortable.create(wrapperTr, {
        animation: 180,
        delay: 0,
        onEnd: evt => {
          const oldItem = this.dropCol[evt.oldIndex]
          this.dropCol.splice(evt.oldIndex, 1)
          this.dropCol.splice(evt.newIndex, 0, oldItem)
        }
      })
    }
  }
}
</script>


https://www.cnblogs.com/xiangcheng618/p/10241090.html 这个地址也可以进行拖

拽,明天去研究一下


1425695-20200318224212509-2134306261.gif


在后来和产品的沟通中发现,并不是这样的效果。


他希望排序后,做左边的日期也能够排序。


所以其他的都不改变,是改变这个rowDrop方法。


//行拖拽
      rowDrop() {
      const tbody = document.querySelector('.el-table__body-wrapper tbody')
      const _this = this
      Sortable.create(tbody, {
        onEnd({ newIndex, oldIndex }) {
          const currRow = _this.tableData.splice(oldIndex, 1)[0]
          _this.tableData.splice(newIndex, 0, currRow)
          //对日期进行重新排序
          for(let i=0;i<_this.tableData.length;i++){
            _this.tableData[i].date=i+1;
          }
        }
      })
    },


如何达到产品说的那一种效果。我之前回来想了很久。都没有做好.


今天忽然脑壳开窍了,就想明白了。


我觉得  思维灵活比是编成中最重要的,没有之一哈。


需要注意一下,你在浏览器中是ok的;


但是你在火狐浏览器上会出现拖拽的时


火狐还是打开了一个新的tab,并且搜索了。


那么应该如何去解决呢???


created() {
    document.body.ondrop = function (event) {
        event.preventDefault();
        event.stopPropagation();
    }
},

1425695-20200412225640297-785026362.png


相关文章
|
1月前
|
资源调度
Vue3导入表格功能
Vue3导入表格功能
|
1月前
|
JavaScript
【Ant designe vue】中有关表格列中日期展示 yyyy-mm-dd 格式问题
【Ant designe vue】中有关表格列中日期展示 yyyy-mm-dd 格式问题
49 0
|
1月前
|
JavaScript
vue 实现表格循环滚动 vue-seamless-scroll插件的安装与使用
vue 实现表格循环滚动 vue-seamless-scroll插件的安装与使用
178 0
|
14天前
|
JavaScript
Vue.js中使用作用域插槽实现自定义表格组件
Vue.js中使用作用域插槽实现自定义表格组件
|
1月前
|
资源调度 JavaScript 前端开发
将Elementui里的Table表格做成响应式并且和Pagination分页组件封装在一起(Vue实战系列)
将Elementui里的Table表格做成响应式并且和Pagination分页组件封装在一起(Vue实战系列)
|
1月前
|
JavaScript
vue3表格编辑(数据回显)和删除功能实现
vue3表格编辑(数据回显)和删除功能实现
27 1
|
26天前
|
资源调度 JavaScript UED
vue路由的基础知识总结,vueRouter插件的安装与使用
vue路由的基础知识总结,vueRouter插件的安装与使用
|
1月前
|
JavaScript
Ant design vue 样式调整(包含导航栏、a-table表格、分页)
Ant design vue 样式调整(包含导航栏、a-table表格、分页)
96 1
|
1月前
|
JavaScript 前端开发
【vue】设计一个表格,增删改查,分页,固定列,特殊字符校验
【vue】设计一个表格,增删改查,分页,固定列,特殊字符校验
20 0
【vue】设计一个表格,增删改查,分页,固定列,特殊字符校验
|
1月前
|
资源调度 JavaScript 开发者
插件使用:扩展Vue功能与第三方插件
【4月更文挑战第23天】Vue凭借其轻量级和灵活性在Web开发中备受青睐,而插件则进一步增强了其功能。本文探讨了如何在Vue项目中选择、安装、配置和管理插件,以适应不同需求。要点包括:选择可靠且兼容的插件,使用npm或yarn安装,根据文档配置,以及注意性能影响。明智使用插件能提升开发效率,但需避免过度依赖,确保与项目目标和技术栈匹配。不断学习新插件,可保持技术领先并优化项目实践。