vue3+ts+element-plus管理系统实际开发之H5 拖放事件实现一个拖拉拽


注释: 接上期[管理系统之增删改查],(https://blog.csdn.net/men_gqi/article/details/131718259?spm=1001.2014.3001.5501)这篇实战一些插件和api

屏幕录制2023-07-21 14.57.01

功能一:使用H5 拖放事件实现一个拖拉拽

知识备注:
拖动事件:dragstart、drag、dragend
放置事件:dragenter、dragover、drop

✏️ 拖放逻辑以及流程

从拖动元素放置到目标元素上依次触发
dragstart(触发拖动事件)—> dragenter(拖拉进入当前节点时触发当前节点) --------->dragover(增加视觉感这个博主总结的挺详细的) ----> dragend(当拖动停止时事件)

1. 基本布局-- 使用for遍历出列表并添加draggable 属性设置为 true,把元素设置为可拖放

在这里插入图片描述
在这里插入图片描述

展示效果:此时元素可拖动
在这里插入图片描述

2. 添加拖动开始事件dragstart,拖动结束事件dragenter

在这里插入图片描述
展示效果:拖拽a到c的位置
在这里插入图片描述

3. 2中视觉上拖拽不明显,添加拖动时候原始数据隐藏(opacity: 0;),拖宅结束后释放隐藏元素到最新位置
  • dragstart方法中添加,class名称来隐藏原始原素
  setTimeout(() => {
        e.target.classList.add('moveing')//元素正处于拖拽中时候,原始原素设置为透明状态
        console.log(7,e.target)
    }, 0)
  • 元素拖拽结束,dragend方法中释放元素
e.target.classList.remove('moveing')
function dragover(e) {
    console.log(e.dataTransfer)
    e.preventDefault()
    e.dataTransfer.dropEffect = 'move'
}

✏️ 九宫格拖拽

拖懂逻辑相同,直接复制一份代码,css样式修改下
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

📒 展示效果

在这里插入图片描述

✏️ 完整代码

<template>
    <div class="dragH5">
        <div class="item" v-for="(item, i) in drag.list" :key="item.id" draggable="true" @dragstart="dragstart($event, i)"
            @dragenter="dragenter($event, i)" @dragend="dragend" @dragover="dragover">
            {{ item.name }}
        </div>
        <div class="box-card">
            <div class="item" v-for="(item, i) in drag.list2" :key="item.id" draggable="true" @dragstart="dragstart2($event, i)"
            @dragenter="dragenter2($event, i)" @dragend="dragend2" @dragover="dragover2">
            {{ item.name }}
           </div>
        </div>
    </div>
</template>
<script setup>
import { reactive } from 'vue'
const drag = reactive({
    list: [
        { name: 'a', id: 1 },
        { name: 'b', id: 2 },
        { name: 'c', id: 3 },
        { name: 'd', id: 4 },
        { name: 'e', id: 5 },
    ],
    list2: [
        { name: 'a', id: 11 },
        { name: 'b', id: 12 },
        { name: 'c', id: 13 },
        { name: 'd', id: 14 },
        { name: 'e', id: 15 },
        { name: 'f', id: 16 },
        { name: 'g', id: 17 },
        { name: 'h', id: 18 },
        { name: 'i', id: 19 },
        { name: 'j', id: 110 },
        { name: 'k', id: 111 },
        { name: 'l', id: 112 },
    ]
})
// 列表拖拽
let dragIndex = 0//记录原始拖拽元素下标

function dragstart(e, index) {
    e.stopPropagation()//方法阻止事件冒泡
    dragIndex = index//找到当前拖动元素下标
    setTimeout(() => {
        e.target.classList.add('moveing')//元素正处于拖拽中时候,原始原素设置为透明状态
        console.log(7,e.target)
    }, 0)
}
function dragenter(e, index) {//拖拉进入当前节点时触发当前节点
    e.preventDefault()//阻止默认活动
    // 拖拽到原位置时不触发
    if (dragIndex !== index) {
        const source = drag.list[dragIndex];//找到当前拖动元素原始列表中位置
        drag.list.splice(dragIndex, 1);//删除原始位置
        drag.list.splice(index, 0, source);//添加到新的位置
        dragIndex = index   // 更新节点位置
    }
}
function dragover(e) {
    console.log(e.dataTransfer)
    e.preventDefault()
    e.dataTransfer.dropEffect = 'move'
}
function dragend(e) {//元素拖拽结束
    e.target.classList.remove('moveing')//元素拖拽结束,去掉设置透明状态的class
}
//九宫格使用
let dragIndex2 = 0//记录原始拖拽元素下标
function dragstart2(e, index) {
    e.stopPropagation()//方法阻止事件冒泡
    dragIndex = index//找到当前拖动元素下标
    setTimeout(() => {
        e.target.classList.add('moveing')//元素正处于拖拽中时候,原始原素设置为透明状态
        console.log(7,e.target)
    }, 0)
}
function dragenter2(e, index) {//拖拉进入当前节点时触发当前节点
    e.preventDefault()//阻止默认活动
    // 拖拽到原位置时不触发
    if (dragIndex !== index) {
        const source = drag.list[dragIndex];//找到当前拖动元素原始列表中位置
        drag.list.splice(dragIndex, 1);//删除原始位置
        drag.list.splice(index, 0, source);//添加到新的位置
        dragIndex = index   // 更新节点位置
    }
}
function dragover2(e) {
    console.log(e.dataTransfer)
    e.preventDefault()
    e.dataTransfer.dropEffect = 'move'
}
function dragend2(e) {//元素拖拽结束
    e.target.classList.remove('moveing')//元素拖拽结束,去掉设置透明状态的class
}
</script>

<style lang="scss" scoped>
.dragH5{
    overflow-y: scroll;
    height: calc(100vh - 49px);
}
// 列表拖拽
.item {
    width: 200px;
    height: 40px;
    line-height: 40px;
    // background-color: #f5f6f8;
    background-color: skyblue;
    text-align: center;
    margin: 10px;
    color: #fff;
    font-size: 18px;
}

.container {
    position: relative;
    padding: 0;
}

.moveing {
    opacity: 0;
}


// 卡片拖拽
.box-card {
  width: 480px;
  height: 500px;
  display: flex;
  margin-left: 20px;
  flex-wrap: wrap;
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
  .item{
    width: 100px;
    height: 50px;
    margin-left: 20px;
  }
}
</style>

要搭建一个vue3 ts pinia element-plus后台管理系统框架,可以按照以下步骤进行: 1. 安装Node.js和Vue CLI Vue CLI是用于创建和管理Vue项目的官方工具,需要先安装Node.js和Vue CLI。 2. 创建基于Vue3和TypeScript的项目 使用Vue CLI创建一个基于Vue3和TypeScript的项目,输入以下命令: ``` vue create my-project --preset=@vue/cli-plugin-typescript ``` 3. 安装Pinia Pinia是一个Vue 3状态管理库,可以用于管理应用程序的状态。在项目中安装Pinia,输入以下命令: ``` npm install pinia ``` 4. 安装Element Plus Element Plus是一个基于Vue.js 3的UI库,可用于构建后台管理系统。在项目中安装Element Plus,输入以下命令: ``` npm install element-plus ``` 5. 创建页面和组件 根据项目需求,创建页面和组件。 6. 配置Pinia 在main.ts中引入Pinia,并在创建Vue实例时使用它。示例代码如下: ```typescript import { createApp } from 'vue' import App from './App.vue' import { createPinia } from 'pinia' const app = createApp(App) app.use(createPinia()) app.mount('#app') ``` 7. 配置Element Plus 在main.ts中引入Element Plus,并在创建Vue实例时使用它。示例代码如下: ```typescript import { createApp } from 'vue' import App from './App.vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 8. 编写页面和组件 使用Vue3和TypeScript编写页面和组件。 9. 运行项目 运行项目,输入以下命令: ``` npm run serve ``` 以上就是搭建一个vue3 ts pinia element-plus后台管理系统框架的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大白菜1号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值