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

代码如下:

<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. JSP内置对象详解及示例

    目录 JSP 内置对象 out request response config application session pageContext page exception JSP 内置对象 jsp一 ...

  2. 用CodePush在React Native App中做热更新

    最近在学React Native,学到了CodePush热更新. 老师讲了两种实现的方法,现将其记录一下. 相比较原生开发,使用React Native开发App不仅能节约开发成本,还能做原生开发不能 ...

  3. SpringBoot 整合 Zookeeper 接入Starring微服务平台

    背景 最近接的一个项目是基于公司产品Starring做的微服务支付平台,纯后台项目,实现三方支付公司和银行接口来完成用户账户扣款,整合成通用支付接口发布给前端调用. 但是扯蛋了,这边前端什么都不想做, ...

  4. php 第1讲 html介绍 html运行原理①

    1. html (hypertext mark-up language )是 超文本编辑语言,主要的用处是做网页,可以在网页上显示文字.图形.动画.视频... “标记“有时候也称之为“元素” 动态网页 ...

  5. selenium无界面执行和反爬

    selenium无界面执行和反爬 无界面执行 from selenium import webdriver from selenium.webdriver.chrome.options import ...

  6. C# 轮流展示照片

    代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...

  7. 网站出现bug,我深夜被叫醒处理,用一个触发器解决了问题

    凌晨两点,我正在睡梦之中,此时电话忽然想起,在漆黑的深夜中显得格外刺耳. 这个时间点电话响了肯定没好事,因为我的手机在夜间模式下,除非被同一个电话号码打三次,否则是静音,因此电话那边的人肯定有急事找我 ...

  8. error Couldn't find a package.json file in

    error Couldn't find a package.json file in解决方法:首先初始化,再安装相应的文件 (1). npm init -f //强迫初始化文件 (2). npm in ...

  9. 浏览器url访问tomcat出现错误 java.lang.NoSuchMethodError解决方法

    一般该类错误: 找不到方法或找不到类, 都是maven pom 仓库依赖的问题,有时是 因为缺少该依赖类,可以考虑添加相关依赖: 有时因为依赖冲突, 可以到 maven 的仓库下面把 有关该类的包 全 ...

  10. Python超简单的爬取网站中图片

    1.首先导入相关库 import requests import bs4 import threading #用于多线程爬虫,爬取速度快,可以完成多页爬取 import os 2.使用bs4获取htm ...