当前位置: 首页 > news >正文

使用#sortablejs插件对表格中拖拽行排序#Vue3#后端接口数据

使用#sortablejs对表格中拖拽行排序#Vue3#后端接口数据

*效果:
在这里插入图片描述

拖动表格行排序

首先安装插件sortable

npm install sortablejs --save

代码:

<template><!-- sortable.js 进行表格排序 --><!-- 演示地址 --><div class="dem-add"><!-- Search start --><div class="dem-title"><p>演示地址</p><el-inputclass="query-input"v-model="tableForm.demoDevice"placeholder="搜索"@keyup.enter="handleQueryName"><template #prefix><el-icon class="el-input__icon"><search /></el-icon></template></el-input><el-button type="primary" :icon="Plus" circle @click="handleAdd" /></div><!-- Search end --><!-- Table start --><div class="bs-page-table"><el-table :data="tableData" :row-key="(record) => record.sort"><el-table-column prop="sort" label="排序" width="60" /><el-table-column prop="demoDevice" label="演示端" width="150" /><el-table-column prop="address" label="地址" width="180" /><el-table-column prop="description" label="特殊说明" width="180" /><el-table-column prop="fileIds" label="附加" width="100"><template #default="scope"><a:href="`http://192.168.1.214:5050${scope.row.files[0].filePath}`"style="color: blue; text-decoration: none"target="_blank"><el-buttoncirclesize="default"type="default":icon="FolderChecked"></el-button></a></template></el-table-column><el-table-column fixed="right" label="操作" width="100"><template #default="scope"><el-buttontype="danger"@click="handleRowDel(scope.$index)":icon="Delete"circle/></template></el-table-column></el-table><el-dialog v-model="dialogFormVisible" title="新增" width="500"><el-form :model="tableForm"><el-form-item label="排序" :label-width="80"><el-input v-model="tableForm.sort" autocomplete="off" /></el-form-item><el-form-item label="演示端" :label-width="80"><el-input v-model="tableForm.demoDevice" autocomplete="off" /></el-form-item><el-form-item label="地址" :label-width="80"><el-input v-model="tableForm.address" autocomplete="off" /></el-form-item><el-form-item label="特殊说明" :label-width="80"><el-input v-model="tableForm.description" autocomplete="off" /></el-form-item><el-form-item label="附加" :label-width="80"><el-uploadmultipleclass="upload-demo"action="":http-request="uploadFile"list-type="picture"><el-button type="primary">上传文件</el-button></el-upload></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="dialogFormVisible = false"> 取消 </el-button><el-button type="primary" @click="dialogConfirm"> 确认 </el-button></div></template></el-dialog></div><!-- Table end --></div>
</template>
<script setup lang="ts">
import { Plus } from "@element-plus/icons-vue";
import { ref, onMounted, toRaw } from "vue";
import axios from "axios";
import { useRouter } from "vue-router";
import { Search } from "@element-plus/icons-vue";
import { Delete } from "@element-plus/icons-vue";
import { FolderChecked } from "@element-plus/icons-vue";
import { nextTick } from "vue";
import Sortable from "sortablejs";const router = useRouter();
console.log(router.currentRoute.value.path); //当前路由路径
sessionStorage.setItem("path", router.currentRoute.value.path);// 演示地址
// 拖动行排序
const changeRow = () => {const el = document.querySelector(".el-table__body-wrapper tbody");new Sortable(el, {animation: 150, // 动画// sort: true,ghostClass: "sortable-ghost",onEnd: (evt: any) => {console.log("oldIndex", evt.oldIndex); // 当前行的被拖拽前的顺序console.log("newIndex", evt.newIndex); // 当前行的被拖拽后的顺序const curRow = tableData.value.splice(evt.oldIndex, 1)[0];tableData.value.splice(evt.newIndex, 0, curRow);console.log("tableData.value新数据", tableData.value);},});
};// 定义表格
const tableData = ref<any>([]);
// 定义弹窗表单
let tableForm = ref({sort: "",demoDevice: "",address: "",description: "",fileIds: <any>[],file: "",
});
// 默认对话框关闭状态
const dialogFormVisible = ref(false);
// 调用接口数据在表单显示
const port1 = async () => {await axios.post("http://192.168.1.214:5050/api/Project/DemoGetTable", {pageIndex: 1,pageSize: 100,projectId: "1",}).then((response) => {// 将找到的数据返回给表单显示tableData.value = response.data.data.list;console.log("tableData.value原数据", tableData.value);}).catch((error) => {console.error(error);});
};
// 挂载
onMounted(() => {port1();nextTick(() => {changeRow();});
});
// 搜索(通过name值查找)
const handleQueryName = () => {console.log("搜索");
};
// 新增
const handleAdd = async () => {// 打开新增对话框dialogFormVisible.value = true;// 设置空的绑定对象tableForm.value = {demoDevice: "",address: "",description: "",sort: "",fileIds: [],file: "",};
};
// 上传文件
const uploadFile = async (val: any) => {tableForm.value.file = val.file;// 数据交互let formdata = new FormData();formdata.append("File", tableForm.value.file);axios// 上传文件接口.post("http://192.168.1.214:5050/api/File/UploadFile", formdata, {headers: { "Content-Type": "multipart/form-data" },}).then((res) => {// 将文件id值传给tableForm的属性fileIdstableForm.value.fileIds.push(res.data.data.id);const newobj = Object.assign({ projectId: "1" }, toRaw(tableForm.value));axios// 添加演示地址接口.post("http://192.168.1.214:5050/api/Project/DemoAdd", newobj);});
};
// 删除
const handleRowDel = async (index: any) => {// 找到要删除的接口中对应的对象await axios.post("http://192.168.1.214:5050/api/Project/DemoDel", {// 获取到当前索引index下的id值,toRaw()方法获取原始对象id: toRaw(tableData.value[index]).id,});// 从index位置开始,删除一行即可tableData.value.splice(index, 1);
};
// 确认表单弹窗
const dialogConfirm = () => {dialogFormVisible.value = false;port1();
};
</script><style scoped lang="scss">
// 演示地址
.dem-add {width: 800px;margin: 20px 50px;background-color: rgba(255, 255, 255, 0.333);box-shadow: 0 8px 16px #0005;border-radius: 16px;overflow: hidden;// 标签.dem-title {display: flex;justify-content: space-between;align-items: center;background-color: rgba(207, 204, 204, 0.267);padding: 0 20px;p {float: left;width: 150px;color: #000;}// 搜索::v-deep .el-input__wrapper {border-radius: 100px;}.query-input {width: 240px;height: 35px;margin: 10px auto;margin-left: 330px;background-color: transparent;transition: 0.2s;}::v-deep .el-input__wrapper:hover {background-color: #fff8;box-shadow: 0 5px 40px #0002;}// 增加按钮.el-button {float: left;margin-top: 3px;margin-left: 10px;}}// 表格.bs-page-table {.el-table {width: 100%;border: 1px solid rgb(219, 219, 219);padding: 10px;.el-table-column {border-collapse: collapse;text-align: left;}}}// 分页.demo-pagination-block {padding: 9px 20px;}
}
</style>

#这个只是表面功夫,后端数据库中的数据排序一直都没变,所以想要真正改变排序,还需要后端写个接口。

相关文章:

  • Linux用户,用户组,所有者权限分配,sftp用户权限分配
  • 问题 B: 2.左右(lr.cpp/pas)
  • C++:程序设计实例
  • 2024/06/11--代码随想录算法1/17|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • Spark的开发环境配置
  • LeakSearch:针对网络公开凭证的安全扫描与检测工具
  • 【设计模式】创建型设计模式之 建造者模式
  • 【机器学习】让计算机变得更加智能
  • IDEA创建Maven项目
  • 【设计模式】创建型设计模式之 工厂模式
  • 我要成为算法高手-双指针篇
  • 34.打印K型
  • Vue10-事件修饰符
  • React@16.x(25)useReducer
  • orbslam2代码解读(4):loopclosing回环检测线程
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 10个最佳ES6特性 ES7与ES8的特性
  • 230. Kth Smallest Element in a BST
  • Apache Spark Streaming 使用实例
  • ECMAScript6(0):ES6简明参考手册
  • Electron入门介绍
  • HashMap剖析之内部结构
  • JavaScript类型识别
  • Java读取Properties文件的六种方法
  • React Transition Group -- Transition 组件
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 关于Flux,Vuex,Redux的思考
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 力扣(LeetCode)22
  • 聊聊hikari连接池的leakDetectionThreshold
  • 那些年我们用过的显示性能指标
  • 前言-如何学习区块链
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 通过调用文摘列表API获取文摘
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #define,static,const,三种常量的区别
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #微信小程序:微信小程序常见的配置传值
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (2)STM32单片机上位机
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (南京观海微电子)——I3C协议介绍
  • (转)树状数组
  • **CI中自动类加载的用法总结
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net 使用ajax控件后如何调用前端脚本
  • .Net接口调试与案例
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET连接MongoDB数据库实例教程
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @Autowired 与@Resource的区别