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

代码如下:

  1. <template>
  2.  
  3. <el-dialog
  4. title="菜单排序"
  5. :close-on-click-modal="false"
  6. :visible.sync="visible"
  7. width="600px">
  8.  
  9. <div style="margin: 0 auto;height: 400px;overflow-y: auto;overflow-x: hidden;">
  10. <ul class="dragSort">
  11. <transition-group>
  12. <li
  13. draggable="true"
  14. @dragstart="handlerDragstart"
  15. @drag="handlerDrag"
  16. @dragend="handlerDragend"
  17. :id="index"
  18. v-for="(item, index) in dataList"
  19. :key="item.menuId">
  20. 【{{index+1}}】 {{item.name}}
  21. <i><span>{{item.orderNum}}</span></i>
  22. </li>
  23. </transition-group>
  24. </ul>
  25. </div>
  26.  
  27. <!--取消与确认按钮-->
  28. <span slot="footer" class="dialog-footer">
  29. <el-button style="background-color: #479dff;color: #ffffff;" type="primary" @click="handlerCancel()">重置</el-button>
  30. <el-button style="background-color: #479dff;color: #ffffff;" type="primary" @click="handlerSubmit()">确定</el-button>
  31. </span>
  32.  
  33. </el-dialog>
  34.  
  35. </template>
  36. <script>
  37. export default {
  38. props: {},
  39.  
  40. name: 'dragSort',
  41.  
  42. data () {
  43. return {
  44. //是否弹窗
  45. visible: false,
  46.  
  47. //拖动前数据
  48. beforeDataList: [],
  49.  
  50. //拖动后数据
  51. dataList: [],
  52. }
  53.  
  54. },
  55.  
  56. methods: {
  57.  
  58. init(){
  59. this.visible = true;
  60. this.$http({
  61. url: this.$http.adornUrl(`/sys/menu/selectHomepageMemu`),
  62. method: 'get',
  63. params: this.$http.adornParams()
  64. }).then(({data}) => {
  65. console.log(data)
  66. this.beforeDataList = data.list;
  67. this.dataList = data.list;
  68.  
  69. })
  70. },
  71.  
  72. handlerDragstart (e) {
  73. const { y, target } = e
  74. target.style.opacity = '.5'
  75. target.oriY = y
  76. target.oriIndex = Number(target.id)
  77. },
  78.  
  79. handlerDrag (e) {
  80. const { y, target } = e
  81. if (y === 0) return
  82. const offset = y - target.oriY
  83. const length = this.dataList.length
  84. if (Math.abs(offset) > target.offsetHeight) {
  85. const index = target.oriIndex
  86. const copyList = [...this.dataList]
  87. let targetIndex = index + Math.round(offset / target.offsetHeight)
  88. if (targetIndex > length - 1) {
  89. targetIndex = length - 1
  90. } else if (targetIndex < 0) {
  91. targetIndex = 0
  92. }
  93. const readyToAppend = copyList.splice(index, 1)[0]
  94. copyList.splice(targetIndex, 0, readyToAppend)
  95. target.oriIndex = targetIndex
  96. target.oriY = y
  97. this.dataList = copyList
  98. }
  99. },
  100.  
  101. handlerDragend (e) {
  102. const { y, target } = e
  103. target.style.opacity = '1'
  104. },
  105.  
  106. //取消
  107. handlerCancel(){
  108. this.dataList = this.beforeDataList;
  109. },
  110.  
  111. saveSortingData(){
  112.  
  113. let menuIdArray = [];
  114.  
  115. if(this.dataList.length > 0){
  116. for(let i=0; i<this.dataList.length; i++){
  117. menuIdArray.push(this.dataList[i].menuId);
  118. }
  119. }
  120.  
  121. this.$http({
          //返回重组数组给后台接口
  122. url: this.$http.adornUrl(`/xxx/xxx/xxx`),
  123. method: 'post',
  124. data: this.$http.adornData(menuIdArray, false)
  125. }).then(({data}) => {
  126. if (data && data.code === 0) {
  127. this.$message({
  128. message: '操作成功',
  129. type: 'success',
  130. duration: 1500,
  131. onClose: () => {
  132. this.init();
  133. }
  134. })
  135. } else {
  136. this.$message.error(data.msg)
  137. }
  138. })
  139. },
  140.  
  141. //确定
  142. handlerSubmit(){
  143. this.$confirm("该操作将按顺序重新排序?", '提示', {
  144. distinguishCancelAndClose: true,
  145. confirmButtonText: '确定',
  146. cancelButtonText: '取消',
  147. type: 'warning'
  148. }).then(() => {
  149. this.saveSortingData();
  150.  
  151. }).catch(() => {
  152. return;
  153. });
  154.  
  155. }
  156.  
  157. }
  158. }
  159. </script>
  160.  
  161. <style scoped lang="scss">
  162. .dragSort{
  163. width: 400px;
  164. list-style: none;
  165. margin: 0;
  166. padding: 0;
  167. li{
  168. text-align: left;
  169. border: 1px solid #f1f1f1;
  170. padding: 10px;
  171. box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .1);
  172. border-radius: 5px;
  173. margin-bottom: 10px;
  174. cursor: move;
  175. width: 100%;
  176. background: #fff;
  177. transition: all .3s;
  178. z-index: 1;
  179. i {
  180. font-size: 16px;
  181. color: #409EFF;
  182. float: right;
  183. }
  184. }
  185. }
  186. </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. php基础文档

    目录 PHP简介 PHP概述和名词解释 PHP常见数据类型 PHP运算符 PHP流程控制语句 PHP函数 PHP类与对象 PHP会话session与缓存cookie(扩展) 1.PHP简介 PHP,即 ...

  2. FullGC排查心得

    最近线上系统(JDK1.7)出现了多次FullGC,但是情况都不一样,今天有时间,将FullGC的排查思路以及如何解决记录下,供大家一起探讨. 场景一: 系统发布上线之后,里面收到如下告警信息: 内容 ...

  3. logistic回归介绍以及原理分析

    1.什么是logistic回归? logistic回归虽然说是回归,但确是为了解决分类问题,是二分类任务的首选方法,简单来说,输出结果不是0就是1 举个简单的例子: 癌症检测:这种算法输入病理图片并且 ...

  4. React躬行记(15)——React Hooks

    Hook(钩子)是React v16.8新引入的特性,能以钩子的形式为函数组件附加类组件的状态.生命周期等特性.React的类组件有难以拆分.测试,状态逻辑分散,难以复用等问题,虽然可以通过渲染属性( ...

  5. 【设计模式大法】Iterator模式

    Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...

  6. Sting类字符串

    一.声明字符串 在java语言中字符串必须包含在一对双引号(" ")之内,但不能作为其他数据类型来使用,如"1+2"的输出结果不可能是3: 可以通过以下语法格式 ...

  7. AJAX与Django

    AJAX 什么是AJAX? AJAX不是JavaScript的规范,它的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求.提交任务之 ...

  8. MySQL 库、表、记录、相关操作(3)

    MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...

  9. Mac系统安装文件提示文件已损坏,打不开解决办法

    Mac系统安装文件提示文件已损坏,打不开解决办法: 修改系统配置:系统偏好设置 - 安全性与隐私 - 任何来源”.如果没有“任何来源”这个选项,是因为你的系统是macOS Sierra 10.12,苹 ...

  10. linux搭建Git

    安装依赖库和编译工具为了后续安装能正常进行,我们先来安装一些相关依赖库和编译工具yum install curl-devel expat-devel gettext-devel openssl-dev ...