vue项目简单菜单排序
功能:拖拉后,数据重组,然后返回数组给后台处理
代码如下:
- <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项目简单菜单排序的更多相关文章
- vue项目导航菜单实现
vue项目导航菜单问题 目标:横向菜单点击跳转,颜色变换,刷新可保持状态 // 模板template中通过循环菜单列表生成,动态类名改变颜色 <li v-for="(item, ind ...
- 使用vue-cli搭建vue项目简单教程
一直没有时间来写些东西,今天就写写vue脚手架吧,初建一个vue项目. vue是近段时间来特别火的一个mvvm框架,小巧.简单.易学,如果你的前端基础还好的话,学起来挺简单的.官网地址: https: ...
- VUE项目二级菜单刷新时404 nginx
原因:vue项目的路径时虚拟路径,并不存在,所以用nginx去请求请求不到,所以vue项目做了两部调整: 1.所有的请求后端接口地址前端写死 2.nginx里把所有的接口转发后端删掉,并添加以下内容 ...
- 简单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 ...
- VSCode配置简单的vue项目
VSCode配置简单的vue项目 https://www.cnblogs.com/wnxyz8023/p/9989447.html 由于最近要使用的项目框架为前后端分离的,采用的是vue.js+web ...
- 搭建Vue.js环境,建立一个简单的Vue项目
基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...
- day 82 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- 使用VSCode配置简单的vue项目
由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...
- 三、使用VSCode配置简单的vue项目
由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...
随机推荐
- php基础文档
目录 PHP简介 PHP概述和名词解释 PHP常见数据类型 PHP运算符 PHP流程控制语句 PHP函数 PHP类与对象 PHP会话session与缓存cookie(扩展) 1.PHP简介 PHP,即 ...
- FullGC排查心得
最近线上系统(JDK1.7)出现了多次FullGC,但是情况都不一样,今天有时间,将FullGC的排查思路以及如何解决记录下,供大家一起探讨. 场景一: 系统发布上线之后,里面收到如下告警信息: 内容 ...
- logistic回归介绍以及原理分析
1.什么是logistic回归? logistic回归虽然说是回归,但确是为了解决分类问题,是二分类任务的首选方法,简单来说,输出结果不是0就是1 举个简单的例子: 癌症检测:这种算法输入病理图片并且 ...
- React躬行记(15)——React Hooks
Hook(钩子)是React v16.8新引入的特性,能以钩子的形式为函数组件附加类组件的状态.生命周期等特性.React的类组件有难以拆分.测试,状态逻辑分散,难以复用等问题,虽然可以通过渲染属性( ...
- 【设计模式大法】Iterator模式
Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...
- Sting类字符串
一.声明字符串 在java语言中字符串必须包含在一对双引号(" ")之内,但不能作为其他数据类型来使用,如"1+2"的输出结果不可能是3: 可以通过以下语法格式 ...
- AJAX与Django
AJAX 什么是AJAX? AJAX不是JavaScript的规范,它的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求.提交任务之 ...
- MySQL 库、表、记录、相关操作(3)
MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...
- Mac系统安装文件提示文件已损坏,打不开解决办法
Mac系统安装文件提示文件已损坏,打不开解决办法: 修改系统配置:系统偏好设置 - 安全性与隐私 - 任何来源”.如果没有“任何来源”这个选项,是因为你的系统是macOS Sierra 10.12,苹 ...
- linux搭建Git
安装依赖库和编译工具为了后续安装能正常进行,我们先来安装一些相关依赖库和编译工具yum install curl-devel expat-devel gettext-devel openssl-dev ...