JS拖拽 和 Vue - draggable 两种方法实现拖拽功能(案例二)

表格拖拽(两种实现方法)

提示:此案例是对前面案例一应用的拓展



前言

此省略!!!!!!!!!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、原生的javascript实现拖拽效果

1.创建一个table表格

代码如下

  <!-- style为样式 -->
<style>
  table{
    margin: 0 auto;
  }
  tr,th {
    padding: 30px;
  }
  td{
    text-align: center;
  }
</style>

 <!-- 下面是table内容 -->
 <table border="0" id="myTable" border="1" >
    <thead>
      <tr>
        <th>序号</th>
        <th>书名</th>
        <th>价格</th>
        <th>库存</th>
      </tr>
    </thead>
    <tbody>
      <tr draggable="true">
        <td>1</td>
        <td>javascript进阶之路</td>
        <td>35</td>
        <td>1000</td>
      </tr>
      <tr draggable="true">
        <td>2</td>
        <td>C++是最烂的语言</td>
        <td>55</td>
        <td>44</td>
      </tr>
      <tr draggable="true">
        <td>3</td>
        <td>git可考验培训结果</td>
        <td>18</td>
        <td>42</td>
      </tr>
      <tr draggable="true">
        <td>4</td>
        <td>今年前端不好找work</td>
        <td>10</td>
        <td>1</td>
      </tr>
    </tbody>
  </table>

效果图如下:

在这里插入图片描述

2.获取DOM结构(表格的结构)

代码如下:

   //获取到 tbody 和 tr 
   var tbody = document.querySelector('tbody')
   var trs = document.querySelectorAll('tr')

3.拖拽逻辑(这里使用的事件冒泡)

这里主要是用的是事件冒泡的形势,所以下面的绑定事件都是在tbody上进行的(避免了给每一个tr去绑定事件,减少了代码量,也更加容易理解)

代码如下:

 tbody.addEventListener("dragover",function(event){
        event.preventDefault()
      })
      
 tbody.addEventListener("dragstart",function(event){
        event.dataTransfer.setData("drag_index", event.target.rowIndex); 
      })
 tbody.addEventListener("drop",function(event){
        event.preventDefault()
        //1.获取传过来的被拖元素的信息
        let drag_index = parseInt(event.dataTransfer.getData("drag_index")); 
        
	    //2.当前触发drop的元素(拖拽的目标元素),即放置目标的行下标
	    let drop_index = event.target.parentNode.rowIndex;  
	    
	    //3.这里主要是为了区分是从上向下拖拽 || 从下向上拖拽
       if(drag_index<drop_index){
        	 //将被拖元素放到放置目标的兄弟节点上面(从上向下拖拽)
        tbody.insertBefore(trs[drag_index], event.target.parentNode.nextSibling); 
       }else{
      		 //将拖拽的元素放置在目标节点的前面
        tbody.insertBefore(trs[drag_index], event.target.parentNode);  
       } 
       		//重新获取trs 渲染页面
	     trs = myTable.querySelectorAll("tr");  
      })

效果图如下:

1.拖拽前的样式,如下图:

在这里插入图片描述

2.拖拽(序号1和序号2互换位置)

在这里插入图片描述

二、vue-draggable实现拖拽(vue2和vue3都有版本)

1.npm 安装 vue-draggable 插件(vue3)

代码如下:

npm i -S vuedraggable@next

如下图所示:

在这里插入图片描述

2.vue-draggable的Api

vue-draggable的api具体如下图:

第一部分的Api

在这里插入图片描述

第二部分的Api

在这里插入图片描述

3.vue-draggable的拖拽应用案例(vue3中用的官网的案例)

代码如下(👇👇下面是一个.vue的文件):

<template>
    <!-- <input v-model='num2' /> -->
    <div class="itxst">
    <div>
        <div>123</div>
      <draggable
        :list="state.list"
        ghost-class="ghost"
        chosen-class="chosenClass"
        animation="300"
      >
        <template #item="{ element }">
            <div class="item">{{element}}</div>
        </template>
      </draggable>
    </div>
    <div>{{ state.list }}</div>
  </div>

</template>

<script setup>

import {ref,reactive} from 'vue'
import draggable from "vuedraggable";

// const num2 =ref('222')

const state = reactive({
  list: [
    { name: "JavaScript初级", id: 0 },
    { name: "React初级", id: 1 },
    { name: "Vue3+TS学习", id: 2 },
  ],
});

//拖拽开始的事件
const onStart = () => {
  console.log("开始拖拽");
};

//拖拽结束的事件
const onEnd = () => {
  console.log("结束拖拽");
};



</script>

<style scoped>
.itxst {
  width: 600px;
  display: flex;
margin: 0 auto;
}
.itxst > div:nth-of-type(1) {
  flex: 1;
}
.itxst > div:nth-of-type(2) {
  width: 270px;
  padding-left: 20px;
}
.item {
  border: solid 1px #eee;
  padding: 6px 10px;
  text-align: left;
}

.item:hover {
  cursor: move;
}
.item + .item {
  margin-top: 10px;
}
.ghost {
  border: solid 1px rgb(19, 41, 239);
}
.chosenClass {
  background-color: #f1f1f1;
}
</style>

效果如下图:

1.原本的样式(未拖拽)

在这里插入图片描述

2.id=0的选项与id=1的互换位置 (如下图所示)

在这里插入图片描述


三、vue-draggable的🔗

提示:下面是关于vue-draggable的不同vue版本的文档!!!!!!!!

vue3文档👇👇👇👇👇
Vue3 版本的vue-draggable文档

vue2文档👇👇👇👇👇
Vue2 版本的vue-draggable文档

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满脑子技术的前端工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值