功能:拖拉后,数据重组,然后返回数组给后台处理

代码如下:

<template>

  <el-dialog
title="菜单排序"
:close-on-click-modal="false"
:visible.sync="visible"
width="600px"> <div style="margin: 0 auto;height: 400px;overflow-y: auto;overflow-x: hidden;">
<ul class="dragSort">
<transition-group>
<li
draggable="true"
@dragstart="handlerDragstart"
@drag="handlerDrag"
@dragend="handlerDragend"
:id="index"
v-for="(item, index) in dataList"
:key="item.menuId">
【{{index+1}}】 {{item.name}}
<i><span>{{item.orderNum}}</span></i>
</li>
</transition-group>
</ul>
</div> <!--取消与确认按钮-->
<span slot="footer" class="dialog-footer">
<el-button style="background-color: #479dff;color: #ffffff;" type="primary" @click="handlerCancel()">重置</el-button>
<el-button style="background-color: #479dff;color: #ffffff;" type="primary" @click="handlerSubmit()">确定</el-button>
</span> </el-dialog> </template>
<script>
export default {
props: {}, name: 'dragSort', data () {
return {
//是否弹窗
visible: false, //拖动前数据
beforeDataList: [], //拖动后数据
dataList: [],
} }, methods: { init(){
this.visible = true;
this.$http({
url: this.$http.adornUrl(`/sys/menu/selectHomepageMemu`),
method: 'get',
params: this.$http.adornParams()
}).then(({data}) => {
console.log(data)
this.beforeDataList = data.list;
this.dataList = data.list; })
}, handlerDragstart (e) {
const { y, target } = e
target.style.opacity = '.5'
target.oriY = y
target.oriIndex = Number(target.id)
}, handlerDrag (e) {
const { y, target } = e
if (y === 0) return
const offset = y - target.oriY
const length = this.dataList.length
if (Math.abs(offset) > target.offsetHeight) {
const index = target.oriIndex
const copyList = [...this.dataList]
let targetIndex = index + Math.round(offset / target.offsetHeight)
if (targetIndex > length - 1) {
targetIndex = length - 1
} else if (targetIndex < 0) {
targetIndex = 0
}
const readyToAppend = copyList.splice(index, 1)[0]
copyList.splice(targetIndex, 0, readyToAppend)
target.oriIndex = targetIndex
target.oriY = y
this.dataList = copyList
}
}, handlerDragend (e) {
const { y, target } = e
target.style.opacity = '1'
}, //取消
handlerCancel(){
this.dataList = this.beforeDataList;
}, saveSortingData(){ let menuIdArray = []; if(this.dataList.length > 0){
for(let i=0; i<this.dataList.length; i++){
menuIdArray.push(this.dataList[i].menuId);
}
} this.$http({
      //返回重组数组给后台接口
url: this.$http.adornUrl(`/xxx/xxx/xxx`),
method: 'post',
data: this.$http.adornData(menuIdArray, false)
}).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.init();
}
})
} else {
this.$message.error(data.msg)
}
})
}, //确定
handlerSubmit(){
this.$confirm("该操作将按顺序重新排序?", '提示', {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.saveSortingData(); }).catch(() => {
return;
}); } }
}
</script> <style scoped lang="scss">
.dragSort{
width: 400px;
list-style: none;
margin: 0;
padding: 0;
li{
text-align: left;
border: 1px solid #f1f1f1;
padding: 10px;
box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .1);
border-radius: 5px;
margin-bottom: 10px;
cursor: move;
width: 100%;
background: #fff;
transition: all .3s;
z-index: 1;
i {
font-size: 16px;
color: #409EFF;
float: right;
}
}
}
</style>

功能效果图:

vue项目简单菜单排序的更多相关文章

  1. vue项目导航菜单实现

    vue项目导航菜单问题 目标:横向菜单点击跳转,颜色变换,刷新可保持状态 // 模板template中通过循环菜单列表生成,动态类名改变颜色 <li v-for="(item, ind ...

  2. 使用vue-cli搭建vue项目简单教程

    一直没有时间来写些东西,今天就写写vue脚手架吧,初建一个vue项目. vue是近段时间来特别火的一个mvvm框架,小巧.简单.易学,如果你的前端基础还好的话,学起来挺简单的.官网地址: https: ...

  3. VUE项目二级菜单刷新时404 nginx

    原因:vue项目的路径时虚拟路径,并不存在,所以用nginx去请求请求不到,所以vue项目做了两部调整: 1.所有的请求后端接口地址前端写死 2.nginx里把所有的接口转发后端删掉,并添加以下内容 ...

  4. 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)

    github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...

  5. VSCode配置简单的vue项目

    VSCode配置简单的vue项目 https://www.cnblogs.com/wnxyz8023/p/9989447.html 由于最近要使用的项目框架为前后端分离的,采用的是vue.js+web ...

  6. 搭建Vue.js环境,建立一个简单的Vue项目

    基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...

  7. day 82 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  8. 使用VSCode配置简单的vue项目

    由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...

  9. 三、使用VSCode配置简单的vue项目

    由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...

随机推荐

  1. Java thinking,What is the result?

    interface O { public Integer oc(Integer i); } abstract class A { Integer i; public A(){ this.i = 0; ...

  2. AWK工具 使用介绍

    第6周第5次课(4月27日) 课程内容: 9.6/9.7 awk扩展把这里面的所有练习题做一下http://www.apelearn.com/study_v2/chapter14.html 9.6/9 ...

  3. c 程序之 最大公约数 和 最小公倍数

    1.最大公约数     30  10  -> 10 #include<stdio.h> /* 求最大公约数 辗转相减法 36 --16 4 */ int main(){ int a, ...

  4. 【Luogu P3174 】[HAOI2009]毛毛虫

    前言: 虽然很多人和我想法一样 ,但我还是不要脸地写了这题解 题目: 链接 大意: 在一棵树上取一条最长链以及它所连接的结点总共的结点个数 思路: 取链: 用树形\(DP\)就可以轻而易举的解决这个问 ...

  5. Block循环引用问题

    根控制器没办法销毁,除非程序退出 从一个控制器跳到另外一个控制器,调用该控制器的pop方法才会销毁该控制器 self是一个强指针 在block中使用self时要注意循环引用的问题 最好将当前block ...

  6. 【Java】Java中的final关键字和static

    0.概述 final关键字表示是不可变的: 下面分别从属性(字段).方法.类中进行说明: 1.属性(or字段),表示常量 final声明在属性(or字段)中,表示常量,有两种初始化方法,1是在声明时直 ...

  7. ThinkPHP5——route(路由)的详解

    路由在框架中的作用打个比方的话,路由好比是WEB应用的总调度室,对于访问的URL地址,路由可以拒绝或者接受某个URL请求,并进行分发调度,而且还有一个副作用是因为路由规则可以随意定义,因此可以让你的U ...

  8. 以面向对象的思维,搭建Android与多ble蓝牙设备并发通讯小框架

    Android连接多蓝牙设备.蓝牙与多设备连接.蓝牙ble多设备并发操作.Android连接不了.Android ble开发框架.Android 连接蓝牙总结 前言 小白请绕道百度,本文适合有一定An ...

  9. 使用Python为中秋节绘制一块美味的月饼【华为云技术分享】

    每逢佳节… 对于在外的游子,每逢佳节倍思亲.而对于996ICU的苦逼程序猿们,最期待的莫过于各种节假日能把自己丢在床上好好休息一下了.这几天各公司都陆续开始发中秋礼品了.朋友圈各种秀高颜值的月饼,所以 ...

  10. JS的对象、数组等处理方法:解构

    对象方法简写 你可以在定义方法时省略function和 :: const obj = { insteadOfThis: function() { // do stuff }, youCanDoThis ...