最近在使用element-ui collapse组件的过程中,需要用collapse-item实现拖拽排序,原本组件满足不了,先看下组件的原形。(本文使用的element-ui是用1.4.2版本)

第一版

拖拽结合开源组件 vuedraggable,详细查看vuedraggable组件的用法。

<el-collapse><draggable v-model="arr"><el-collapse-item v-for="(item, index) in arr" :key="'key-' + index"><template slot="title"><span>{{'collapse-item-' + item}}</span></template></el-collapse-item></draggable>
</el-collapse>
复制代码

然后就报错了,呼~ 报错在于,collapse-item组件。

通过阅读element-ui,collapse-item源码路径在 node_modules_element-ui@1.4.2@element-ui\packages\collapse\src\collapse-item.vue

computed: {isActive() {return this.$parent.activeNames.indexOf(this.name) > -1;}
},
复制代码

可以看到计算属性isActive通过父级activeNames来定义的,然而现在组件的层级结构是这样。

collapse-item的父级是draggable, 肯定拿不到原本collapse的父级。

第二版

既然collapse-item拿不到想要的父级,想办法让其拿到collapse,组件重写的思想,可以查看笔者的另外一问: 开发VUE使用第三库,发现有bug怎么办?,当然这里不是组件存在bug,而是扩展,思路是一样的。

创建weCollapseIten.vue组件

<script>
import {CollapseItem
} from 'element-ui'
export default {// 继承了CollapseItemextends: CollapseItem,computed: {isActive () {// 这里重写return this.$parent.$parent.activeNames.indexOf(this.name) > -1}}
}
</script>
复制代码

通过this.parent,拿到父级的父级也就是collapse了。

<el-collapse><draggable v-model="arr">// 使用新组件<we-collapse-item v-for="(item, index) in arr" :key="'key-' + index"><template slot="title"><span>{{'collapse-item-' + item}}</span></template></we-collapse-item></draggable>
</el-collapse>
复制代码

大功靠成,功能已经实现。等等,这样是否还不够通用,而且在element-ui组件之间嵌套一个新的组件,对于阅读者来说肯定是一脸懵逼。不够通用而且没有可以读性。

第三版

创建weCollapse.vue组件

// 将element-ui collapse组件的模板重写
<template><draggable class="el-collapse":list="list""><slot></slot></draggable>
</template><script>
import draggable from './vuedraggable'import {Collapse
} from 'element-ui'export default {// 重写collapse组件extends: Collapse,props: {list: Array},components: {draggable}
}
</script>
复制代码

原本是这样,使用draggable这件代替div,引用weCollapse组件就已经嵌入了draggable组件,带有拖拽的功能,同时不影响原本element-ui collapse组件的功能。

<template><div class="el-collapse"><slot></slot></div>
</template>
复制代码

最终,代码使用组件如下,跟element-ui原本组件的引用的一样的,而功能上却已经大不相同,这样的好处就很多了,当然这组件编写还不完美,wecollapse是否可以支持拖拽应该是封装成一个属性,不支持拖拽的就不需要用draggable来做包裹了,还有本身draggable支持的属性也应该wecollapse来做支持。

<we-collapse :list="arr"><we-collapse-item v-for="(item, index) in arr" :key="'key-' + index"><template slot="title"><span>{{'collapse-item-' + item}}</span></template></we-collapse-item>
</we-collapse>
复制代码

使用继承思想,去开发一款组件(element-ui collapse组件为例子)相关推荐

  1. Vue Element UI 表格组件 利用插槽实现按下按钮后获得本行数据(内容)

    Vue Element UI 表格组件 利用插槽实现按下按钮后获得本行数据(内容) 能够解决的问题 需要在表格中添加一个类似修改或编辑的按钮,按下按钮,弹出的窗口需要本行的渲染数据 需要向服务端提交一 ...

  2. Element UI——滚动条组件(ElScrollBar)修改.el-scrollbar__wrap和el-scrollbar__view的CSS属性

    基本概念 el-scrollbar:Element UI隐藏组件. 注意事项: 1.el-scrollbar的父层要有固定高度 2.el-scrollbar的高度要设成100% 3.如果出现横滚动条, ...

  3. element ui table组件扩展关于列表编辑按钮的位置放置

    最近在用vue做项目,主要是用的element ui的组件,在用的过程中发现有部分组件需要扩展,改源码太折腾,成本高,就想着如何节省成本来实现这些需求,由于项目时间紧张,有些实现来也没来得及记录一下, ...

  4. 实战 | Element UI 父子组件传值与事件绑定(逆向)

    这是小小本周的第四篇,本篇将会倒过来讲解Element UI 父子组件传值与事件绑定. 父子组件传值 新建父组件和子组件 新建父组件 代码如下 <template><div id=& ...

  5. 实战 | Element UI 父子组件传值与事件绑定(正向)

    这是小小的本周的第三篇,本篇将会讲解关于Element UI 父子组件传值与事件绑定. 父子组件传值 新建父组件和子组件 新建父组件 代码如下 <template><div id=& ...

  6. 响应式滚动图懒加载 element ui el-carousel 组件优化代码

    响应式滚动图懒加载 element ui  el-carousel 组件优化代码 懒加载插件vue-lazyload //main.js import VueLazyload from 'vue-la ...

  7. element ui table组件筛选数据

    需求:element ui table组件筛选全部数据 element ui 文档 注意: 1. @filter-change 要写在table根元素,也就是<el-table @filter- ...

  8. element走马灯自动_vue Element UI走马灯组件重写

    1.element ui走马灯组件 -- carousel 分析一波源代码: carousel/src/main.vue 文件为 el-carousel文件主要功能 carousel/src/item ...

  9. element走马灯自动_[转]vue Element UI走马灯组件重写

    1.element ui走马灯组件 -- carousel 分析一波源代码: carousel/src/main.vue 文件为 el-carousel文件主要功能 carousel/src/item ...

最新文章

  1. C# Timer用法及实例详解
  2. PowerEdge M915 – 戴尔打出的又一记虚拟化重拳
  3. LeetCode 873. 最长的斐波那契子序列的长度 题目详解
  4. Java学习笔记7-1——注解与反射
  5. redis 哨兵模式 cluster模式区别_Redis哨兵(Sentinel)模式快速入门
  6. Python中文编码问题详解
  7. 保存div与页面滚动条的位置
  8. ViewPager+Fragment实现支持左右滑动的Tab
  9. Python协程原理介绍及基本使用
  10. Django应用部署 - 上线指南
  11. Charles的安装及设置
  12. 动态规划-最长不下降子序列
  13. 程序设计c语言基础选择题填空题(含答案)
  14. 清华姚班毕业的斯坦福博士陈丹琦入选Google AI2021研究学者计划
  15. python 如何添加国内源_pip和conda添加国内清华镜像源(亲测有效)
  16. Angelababy否认已怀身孕:我怎么不知道
  17. 微信小程序文章怎么首行缩进或取消首行缩进
  18. 清新简约课题开题报告PPT模板
  19. 如何通过3D-MAX制作三维地图模型
  20. linux SecureCRT ssh key认证登陆

热门文章

  1. VS2013在Release情况下使用vector有时候会崩溃的一个可能原因
  2. 面试题 04.02. 最小高度树
  3. poj1328 区间贪心 挑战程序设计竞赛
  4. JS 动态创建元素、删除元素、替换元素、修改元素
  5. Python 中@符号解释
  6. [hihoCoder 1384]Genius ACM
  7. restTemplate重定向问题 cookie问题
  8. Python程序,辅助微信跳一跳游戏介绍
  9. 通过select选项动态异步加载内容
  10. OSX系统编译cocos2dx andriod工程