树形可拖拽排序配置组件

效果

在这里插入图片描述

使用场景

vue2下自定义表格表头配置: 列排序,显示/隐藏等。确保表头以配置项的形式加载,这样表格才能对修改后的配置作响应

思路

1、表格使用render函数加载(如有疑问可私信),通过类似如下的columns配置表头

columns: [{ label: '姓名', prop: 'name', width: '160', fixed: true },{ label: '性别', prop: 'sex', align: 'center', width: '160', fixed: false },{ label: '证件类别', prop: 'cardType', align: 'center', width: '160', fixed: false },{ label: '证件号', prop: 'idCard', align: 'center', width: '260', fixed: false },{ label: '手机号', prop: 'mobile', align: 'center', width: '160', fixed: false },{ label: '标签', prop: 'tag', align: 'center', width: '160', fixed: false },{ label: '操作', prop: 'manage', align: 'center', disControl: true },
]

2、通过element-ui 的 el-dropdown 组件完成配置项的展示动作

<el-dropdown trigger="click" :hide-on-click="false"><span class="el-icon-setting" style="font-size: 25px"></span><template slot="dropdown"><el-dropdown-menu><JSelectionItem :arr.sync="rows" @item-click="itemClickHandle"><template v-slot:default="{item,level}"><div class="item-custom">{{item.id}}</div></template><template v-slot:tool="{item,level}"><span class="el-icon-check"v-if="item.visible"style="size: 20px;margin-top: 5px"></span></template></JSelectionItem></el-dropdown-menu></template></el-dropdown>

3、使用vue.draggable 组件完成拖拽效果,具体应用可参考draggable
4、树形结构往往需要递归加载,我选择使用组件递归而非在render中通过js递归去完成配置组件的加载,因为使用render过程中碰到拖拽动画失效的问题,没有思路去解决。

代码

使用树形配置项的组件

<template><div><el-dropdown trigger="click" :hide-on-click="false"><span class="el-icon-setting" style="font-size: 25px"></span><template slot="dropdown"><el-dropdown-menu><JSelectionItem :arr.sync="rows" @item-click="itemClickHandle"><template v-slot:default="{item,level}"><div class="item-custom">{{item.id}}</div></template><template v-slot:tool="{item,level}"><span class="el-icon-check"v-if="item.visible"style="size: 20px;margin-top: 5px"></span></template></JSelectionItem></el-dropdown-menu></template></el-dropdown></div>
</template><script>
import JSelectionItem from "./JSelectionItem";export default {name: "JHeadManage",components: {  JSelectionItem },data() {return {rows: []}},created() {this.getResource()},methods: {itemClickHandle(item) {item.visible = !item.visibleconsole.log(item)},getResource() {const vm = this//测试用数据只有一个根节点 "0" 方便构建测试用数据树const data = [{ id: '1', parentId: '0' },{ id: '2', parentId: '0' },{ id: '2-0', parentId: '2' },{ id: '1-0', parentId: '1' },{ id: '1-1', parentId: '1' },{ id: '1-1-0', parentId: '1-1' },{ id: '1-1-0-0', parentId: '1-1-0' },{ id: '1-1-0-1', parentId: '1-1-0' },{ id: '1-2', parentId: '1' },{ id: '1-2-0', parentId: '1-2' },{ id: '1-2-1', parentId: '1-2' },]//1) 简单处理数据用于自定义渲染; checked:  indeterminate:data.forEach((d, index) => {d.visible = true //是否选中d.isIndeterminate = false//是否是半选状态d.a = 'a' + index})vm.rows = vm.makeTree(data, 'id', 'parentId', '0')// vm.rows = data},/*** 构建树,与复选逻辑无关* @param data* @param idMark* @param pIdMark* @param rootId* @returns {*}*/makeTree(data, idMark, pIdMark, rootId) {//转化为字典,id为键值,并添加根节点对象let nodeDict = {};(nodeDict[rootId] = { children: [] })[idMark] = rootId;data.forEach(n => (nodeDict[n[idMark]] = n).children = []);data.forEach(d => nodeDict[d[pIdMark]]?.children?.push(d))return nodeDict[rootId].children;}}
}
</script><style scoped>.item-custom {display: inline-flex;padding: 10px 0;margin-right: auto;}</style>

树型配置项组件

定义了两个插槽,一个用来显示主要内容一个用来放置对选项的操作

<template><ul class="list" :style="{paddingLeft:level==0?'10px':'0'}"><draggable v-model="locArr":animation="100"handle=".tip"@start="onStart"@end="onEnd"><transition-group><li class="item" v-for="(c,i) in locArr" :key="i"><div class="item-inner" :style="{paddingLeft:level*20+'px'}" @click.stop="itemClick(c)"><span class="tip el-icon-more-outline"></span><slot v-bind:item="c" v-bind:level="level"></slot><div class="item-tool"><slot name="tool" v-bind:item="c" v-bind:level="level"></slot></div></div><template v-if="c.children&&c.children.length>0"><JSelectionItem :arr.sync="c.children" :level="level+1" @item-click="itemClick"><template v-slot:default="{item,level}"><slot v-bind:item="item" v-bind:level="level"></slot></template><template v-slot:tool="{item,level}"><slot name="tool" v-bind:item="item" v-bind:level="level"></slot></template></JSelectionItem></template></li></transition-group></draggable></ul>
</template><script>
import draggable from 'vuedraggable'
import JSelectionItem from "@/views/demo/JSelectionItem";export default {name: "JSelectionItem",components: {JSelectionItem, draggable},data() {return {}},computed: {locArr: {get() {return this.arr},set(val) {this.$emit('update:arr', val)}},},props: {arr: {type: Array,default: () => []},level: {type: Number,default: 0,}},methods: {onStart() {},onEnd() {},itemClick(item) {this.$emit('item-click', item)}}
}
</script><style scoped>.list {width: 100%;margin: 0;padding: 0;}.item {padding: 0;width: 100%;display: flex;flex-wrap: wrap;align-items: center;}.item-inner {display: flex;width: 100%;position: relative;justify-content: space-between;border-bottom: 1px solid #e5e5e5;user-select: none;}.item-inner:hover {/*font-weight: bold;*/}.item-tool {display: flex;position: absolute;align-items: center;right: 10px;}.tip {transform: rotate(-90deg);cursor: move;font-size: 20px;user-select: none;}</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven 打包指定依赖包_Maven打包成Jar文件时依赖包的问题

我们项目中使用到第三方的库文件&#xff0c;这些jar库文件并没有放到Maven中央库上&#xff0c;导致我们需要在项目中自己配置使用。我们的两三个开发人员对Java都是很熟&#xff0c;因此在使用中遇到了一些问题&#xff0c;表现在&#xff1a;在本地中引入第三方jar包后&…

自适应浮动表单填充布局脚本

效果 1、适合搜素表单布局&#xff0c;查询重置等功能块始终位于最后一行的最后一列 2、适合普通多行两端对齐&#xff0c;未填充满的行左对齐 思路 此脚本目的为实现整齐风格的表单布局&#xff0c;为了达到整齐的效果&#xff0c;每个表单元素或者块都要设置一致的 宽度…

rstudio导入txt文件_R语言 | 读写txt、csv、excel文件

前段时间看到plotnine库(封装的R语言ggplot2)作的图太美了&#xff0c;有点想重新拾起R语言^_^R语言代码略带凌乱&#xff0c;讲真的还是更喜欢Python代码简洁。不过好几年不琢磨R语言&#xff0c;对R语言代码的凌乱美有些新奇&#xff0c;很好玩&#xff0c;这也许就是久别胜新…

erp采购总监个人总结_erp采购总监总结.docx

erp采购总监总结ERP沙盘模拟心得体会——采购总监  刚开始接触ERP&#xff0c;就从学长们那里了解到这门课比较有意思&#xff0c;然后又听老师说我们还有一个为期两周的ERP沙盘模拟&#xff0c;这让我对这门课更有了极大的兴趣。一直期待着沙盘模拟对抗早点到来&#xff0c;…

矩阵字符串配置任意合并表格布局

效果 核心 布局配置矩阵&#xff08;以下为多个模式),可以使用|或\n表示矩阵行 const gridArr [1,2,a,b 3,4,a,b 5,6,a,b ,1,2 3,4 5,6 ,1,2,3,4 3,4]任意横向或者纵向相同的字符表示一个合并块 使用 <CalcTable grid"1,2,a,b|3,4,a,b|5,6,a,b" ><span…

django 套vue 模板_Vue admin template + Django 快速进行Web开发

本文教大家如何使用Vue admin template和Django快速进行Web开发&#xff0c;旨在帮助我们使用现有的工具、框架及开源UI&#xff0c;让我们在基础较为薄弱的情况下&#xff0c;能进行Web开发。本文不会介绍过多的原理&#xff0c;实践为主。Vue admin template的简单使用Vue ad…

js浮点运算式

结果 calc(0.23*-0.03(4*0.2)) >0.7931 代码 //加|减|乘|除 浮点运算 const floatMulti (a, b) > {let m 0, s1 a.toString(), s2 b.toString(), s1l s1.split(.)[1], s2l s2.split(.)[1]m (s1l ? s1l.length : 0) (s2l ? s2l.length : 0)return Number(s1…

悬浮球多功能_一个悬浮球,怎么可以这么贴心~

原标题&#xff1a;一个悬浮球&#xff0c;怎么可以这么贴心~一个悬浮球 满足你N个愿望※ 专题&#xff5c;图文&#xff5c;悬浮球上手指南这个小蛋蛋是不少小朋友喜爱的零食&#xff0c;因为它能满足小朋友好几个愿望&#xff0c;能吃又能玩的零食哪个小朋友会不喜欢&#xf…

python 字典添加元素乱序了_Python有序字典的两个小“惊喜”

从 Python 3.6 开始&#xff0c;常规的字典会记住其插入的顺序&#xff1a;就是说&#xff0c;当遍历字典时&#xff0c;你获得字典中元素的顺序跟它们插入时的顺序相同。在 3.6 之前&#xff0c;字典是无序的&#xff1a;遍历顺序是随机的。关于有序字典&#xff0c;这里有两件…

el-table跨页选中

以id作为唯一标识 模板 <el-table :data"data" ref"table"select-all"selectAll"select"select"style"width:100%"><el-table-column type"selection"></el-table-column><el-table-colum…

bsc是指什么_为什么KPI令人厌恶?中小企业不要乱用KPI!

私信小编“绩效”两字&#xff0c;免费发送60分钟薪酬绩效管理内部培训视频。导读现在很多的企业都会对员工做一些绩效考核&#xff0c;大多数还是采用KPI的方式。但是员工对KPI的考核越来越反感&#xff0c;甚至出现抵触的情况。为什么会出现这种想象呢&#xff1f;其实很简单…

js原生popup_JavaScript的popup框

确认框用于使用户可以验证或者接受某些信息。当确认框出现后&#xff0c;用户需要点击确定或者取消按钮才能继续进行操作。如果用户点击确认&#xff0c;那么返回值为 true。如果用户点击取消&#xff0c;那么返回值为 false。语法&#xff1a;confirm("文本")functi…

解决微信小程序 [Component] slot ““ is not found.

解决方式 当使用自定义组件或者slot标签作为组件A的插槽内容时&#xff0c;在组件A中必须定义一个默认插槽&#xff0c;对普通view等标签无限制。且因为wx:if为false的插槽等同没有定义 场景复现&#xff08;仅以自己遇到情况为例&#xff09; 1、调试基础库2.19.4 2、使用w…

列表排序应用FLIP动画(vue)

效果 原理详解 链接 1.beforeUpdate 获取first 变化前位置 (以id建立map映射) 2.updated 获取变化后位置 last 3.禁用transition并transform元素回初始位置 4.异步恢复transition 并取消 transform 代码 <template><div ref"container"><div style&…

面试项目亮点_码农:面试被问到自己项目亮点时,感觉自己的回答虚伪的不行!...

据我个人观察&#xff0c;大多数程序员都对自己现有的项目有吐糟的习惯&#xff0c;比如吐糟代码逻辑混乱&#xff0c;代码规范问题&#xff0c;代码可读性差&#xff0c;代码没有注释&#xff0c;没有文档&#xff0c;代码极度冗余等等&#xff0c;总之满眼看到的都是一些缺陷…

无敌小恐龙

断网恐龙小游戏无敌版&#xff0c;控制台输入 boxCompare _> false

怎样设计访谈提纲_论访谈提纲的设计

访谈提纲的设计一、访谈提纲如何设计:首先是该怎么命题&#xff0c;也就是访谈的主题或大题目是什么&#xff1b;其次是访谈的题目设计在多少比较合理&#xff1b;再次是访谈的主要点是什么&#xff1b;之后是各题目之间是什么关系&#xff1b;再后是访谈提纲设计注意哪些基本点…

微信小程序 仿 SwipeCell 的滑动单元格 SwipeBox

效果 代码 页面 调用Page <block wx:for"{{4}}" wx:key"{{item}}"><view style"text-align:center;padding:20px"><swipe-box><view slot"left" style"">左侧内容</view><view class&q…

u852日期限制解决补丁_《赛博朋克》1.06补丁出炉:进一步提升主机版本稳定性...

《赛博朋克2077》虽说是出师不利&#xff0c;但是开发商CDPR承诺自己会持续优化这款“尚待打磨”的作品&#xff0c;这种态度还是要稍微肯定一下的。我们看到之前CDPR就已经推送了1.05补丁&#xff0c;修复了大量的BUG以及问题&#xff0c;并且以游戏主机的BUG修复为重点&#…