一招教你轻松实现数据拖拽功能!

前段时间业务需求里面有通过拖拽来实现类似排班的效果,但实际业务逻辑比较复杂,数据间的关联度强,不太方便展示,这里就单独把拖拽写了一个小demo进行展示。

需求:拖动左边表格里的数据进行患者手术排台

实现思路:

1、在需要拖动的dom节点上添加以下属性和事件

:draggable="true"    // 开启拖拽

@dragover.prevent.stop // 防止事件冒泡

@dragstart="onDragleave($event, item)" // 拖拽事件开始(item:被拖拽的所有数据)

2、在目标拖拽dom节点上添加以下事件

@dragover.prevent

@dragenter.prevent

@drop="handleDrop($event, item)" // item:拖拽前绑定的的原始数据

 完整代码:

<template>
  <div class="container">
    <div class="surgicalInformation">
      <!-- 表格 -->
      <table>
        <tr>
          <td>序号</td>
          <td>姓名</td>
          <td>年龄</td>
          <td>科室</td>
        </tr>
        <tr v-for="(item, index) in tableData" :data-id="item.id" :key="item.id" :draggable="true" @dragover.prevent.stop
          @dragstart="onDragleave($event, item)">
          <td>{{ index + 1 }}</td>
          <td>{{ item.name }}</td>
          <td>{{ item.age }} 岁</td>
          <td>{{ item.department }}</td>
        </tr>

      </table>
    </div>
    <div class="shiftInformation">
      <div class="box" ref="targetBox" :data-items="item.name" v-for="item in info" :key="item.name" @dragover.prevent
        @dragenter.prevent @drop="handleDrop($event, item)">
        <div class="boxName">{{ item.name }}</div>
        <div class="boxContain">
          <div style="font-weight: 700;">患者手术信息</div>
          <div class="doctor">姓名 : {{ item.data.doctor }}</div>
          <div class="nurse1">年龄 : {{ item.data.age }}</div>
          <div class="nurse2">科室 : {{ item.data.department }}</div>
        </div>
      </div>
    </div>
  </div>
</template>
<script setup lang='ts' name="fundataDragging">
import { ref } from 'vue'

const targetBox = ref()

// 模拟数据
let tableData = ref<any[]>([])
tableData.value = [
  {
    id: 1,
    age: 20,
    name: '王患者',
    department: '手术室',
  },
  {
    id: 2,
    age: 21,
    name: '李患者',
    department: '妇产科',
  },
  {
    id: 3,
    age: 22,
    name: '陈患者',
    department: 'ICU',
  },
  {
    id: 4,
    age: 23,
    name: '郑患者',
    department: '骨科',
  },
]

// reactive 数据更新页面不更新 数组数据实时更新需要用ref
let info = ref<any[]>([])
info.value = [
  {
    name: 'A-01',
    data: {
      doctor: '',
      nurse1: '',
      nurse2: ''
    }
  },
  {
    name: 'A-02',
    data: {
      doctor: '',
      nurse1: '',
      nurse2: ''
    }
  },
  {
    name: 'A-03',
    data: {
      doctor: '',
      nurse1: '',
      nurse2: ''
    }
  },
]

const onDragleave = (event: any, item: any) => {
  event.dataTransfer.setData("nurseInfo", JSON.stringify(item));
  console.log('---拖拽的数据---: ', item);
}

const handleDrop = (event: any, item: any) => {
  event.preventDefault();
  // 获取拖放的数据
  const data = JSON.parse(event.dataTransfer.getData('nurseInfo'));
  console.log(data, '获取被拖放的数据');
  console.log(item, '拖拽之前的原数据');
  item.data.doctor = data.name
  item.data.age = data.age
  item.data.department = data.department

  // 删除拖拽走的数据
  tableData.value.map((i: any, index: number) => {
    if (data.id == i.id) {
      tableData.value.splice(index, 1)
    }
  })
}
</script>


<style lang="scss" scoped>
.container {
  height: 100%;
  display: flex;

  .surgicalInformation {
    width: 40%;
    height: 100%;
    padding: 10px;

    table {
      border: 1px solid #000;
      width: 100%;
      height: 100%;

      tr {
        height: 50px;
        text-align: center;
        background-color: #ebf5ff;
      }

      tr:nth-child(1) {
        background-color: #33affb;
      }
    }

  }

  .shiftInformation {
    flex: 1;
    height: 100%;
    display: flex;
    justify-content: space-evenly;
    padding: 80px;

    .box {
      width: 250px;
      height: 150px;
      border: 1px solid paleturquoise;
      margin-right: 10px;
      border-radius: 20px;
      display: flex;

      .boxName {
        width: 20%;
        height: 100%;
        background-color: #33affb;
        text-align: center;
        border-radius: 20px;
        line-height: 150px;
        font-size: 20px;
        font-weight: 700;
      }

      .boxContain {
        overflow: hidden;
        display: flex;
        flex-direction: column;
        justify-content: space-evenly;
        margin-left: 20px;
        font-size: 16px;
      }

    }
  }
}
</style>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常抱歉,我的回答有误。在不使用 JavaScript 的情况下实现拖拽上传功能确实比较困难。因为 HTML 标准中并没有提供实现拖拽上传功能的标签和属性,需要通过 JavaScript 来实现拖拽事件的监听和文件上传的处理。如果不使用 JavaScript,我们只能使用 HTML 标准提供的 `<form>` 和 `<input>` 标签来实现上传功能。 下面是一个不使用 JavaScript 实现上传 PDF 文件的美观示例: HTML 代码: ``` <div id="drop-area"> <p>拖拽或点击上传PDF文件</p> <form enctype="multipart/form-data" method="post"> <input type="file" name="file" accept="application/pdf" id="file-input"> <label for="file-input" id="file-label">选择文件</label> <input type="submit" value="上传"> </form> </div> ``` CSS 代码: ``` #drop-area { border: 2px dashed #ccc; width: 100%; height: 200px; text-align: center; font-size: 20px; line-height: 200px; background-color: #f9f9f9; } #file-input { display: none; } #file-label { display: inline-block; margin: 10px; padding: 10px; border: 1px solid #ccc; cursor: pointer; } ``` 在这个示例中,我们使用了一个包含文件上传功能的 `<form>` 表单,在表单中添加了一个 `<input>` 标签,设置 `type="file"` 和 `accept="application/pdf"` 属性,这样用户在上传文件时就只能选择 PDF 格式的文件。同时,我们添加了一个 `<label>` 标签,用于显示上传文件的名称。最后,在表单中添加了一个 `<input>` 标签,设置 `type="submit"` 属性,这样用户点击提交按钮时就可以上传文件了。 需要注意的是,这种方式只能实现文件上传功能,无法实现拖拽上传功能。如果需要实现拖拽上传功能,需要使用 JavaScript 代码来监听拖拽事件,并将文件上传到服务器端。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值