详解为element-ui的Select和Cascader添加弹层底部操作按钮


Posted in Javascript onFebruary 07, 2020

如下图这样把操作按钮放在select弹层底部是一种挺常见的设计方式

详解为element-ui的Select和Cascader添加弹层底部操作按钮

但是很遗憾element-ui没有给我们提供这个插槽,我们想实现这个功能只能重写组件或者等官方更新吗,答案当然是否定的!

花了一点时间通过一个函数实现这个功能,支持el-selectel-cascader,效果点击预览

详解为element-ui的Select和Cascader添加弹层底部操作按钮

详解为element-ui的Select和Cascader添加弹层底部操作按钮

其实逻辑很简单,把下面这段html插入到指定位置就行了

<ul class="el-cascader-menu__list" style="border-top: solid 1px #E4E7ED;padding:0">
 <li class="el-cascader-node" style="height:38px;line-height: 38px">
  <i class="el-icon-plus"></i>
  <span class="el-cascader-node__label">新增商品分类</span>
  <i class="el-icon-arrow-right el-cascader-node__postfix"/>
 </li>
</ul>

我这里直接使用el-cascader的样式,实际使用中这段html可以根据自己的需求修改
上代码,在methods写入这段函数

/**
 * 为element-ui的Select和Cascader添加弹层底部操作按钮
 * @param visible
 * @param refName 设定的ref名称
 * @param onClick 底部操作按钮点击监听
 */
visibleChange(visible, refName, onClick) {
 if (visible) {
  const ref = this.$refs[refName];
  let popper = ref.$refs.popper;
  if (popper.$el) popper = popper.$el;
  if (!Array.from(popper.children).some(v => v.className === 'el-cascader-menu__list')) {
   const el = document.createElement('ul');
   el.className = 'el-cascader-menu__list';
   el.style = 'border-top: solid 1px #E4E7ED; padding:0; color: #606266;';
   el.innerHTML = `<li class="el-cascader-node" style="height:38px;line-height: 38px">
<i class="el-icon-menu"></i>
<span class="el-cascader-node__label">商品分类管理</span>
<i class="el-icon-arrow-right el-cascader-node__postfix"/>
</li>`;
   popper.appendChild(el);
   el.onclick = () => {
    // 底部按钮的点击事件 点击后想触发的逻辑也可以直接写在这
    onClick && onClick();

    // 以下代码实现点击后弹层隐藏 不需要可以删掉
    if (ref.toggleDropDownVisible) {
     ref.toggleDropDownVisible(false);
    } else {
     ref.visible = false;
    }
   };
  }
 }
},

el-selectel-cascader的调用方式一致,这里以el-cascader举例

<el-cascader
  :options="cascaderOptions"
  v-model="cascaderValue"
  @visible-change="v => visibleChange(v, 'cascader', cascaderClick)"
  ref="cascader"
/>

如果调用的地方比较多,也可以像我一样封装成mixins

const selectBottomAction = {
 methods: {
  /**
   * 为element-ui的Select和Cascader添加弹层底部操作按钮
   * @visible-change="v => selectBottomAction(v, {ref: 'select', label: '商品分类' , icon: 'el-icon-menu', click: goodsTypeManagement})"
   * @param visible
   * @param ref   设定的ref名称
   * @param click  底部操作按钮点击监听
   * @param label  标题
   * @param icon   图标class
   * @param arrow  是否显示箭头
   */
  selectBottomAction(visible, {ref, click, label = '', icon = '', arrow = false}) {
   if (visible) {
    const _ref = this.$refs[ref];
    let popper = _ref.$refs.popper;
    if (popper.$el) popper = popper.$el;
    if (!Array.from(popper.children).some(v => v.className === 'el-cascader-menu__list')) {
     const el = document.createElement('ul');
     el.className = 'el-cascader-menu__list';
     el.style = 'border-top: solid 1px #E4E7ED; padding: 0; color: #606266;';
     el.innerHTML = `<li class="el-cascader-node" style="height:38px;line-height: 38px">
     ${icon ? `<i class="${icon}"></i>` : ''}
     <span class="el-cascader-node__label">${label}</span>
     ${arrow ? '<i class="el-icon-arrow-right el-cascader-node__postfix"/>' : ''}
     </li>`;
     popper.appendChild(el);
     el.onclick = () => {
      click && click();
      if (_ref.toggleDropDownVisible) {
       _ref.toggleDropDownVisible(false);
      } else {
       _ref.visible = false;
      }
     };
    }
   }
  },
 },
};

export default selectBottomAction;
提示:后期可能会随着官方版本升级失效,谨慎使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
控制打印时页眉角的代码
Feb 08 Javascript
Ext.MessageBox工具类简介
Dec 10 Javascript
解析使用JS 清空File控件的路径值
Jul 08 Javascript
火狐textarea输入法的bug的触发及解决
Jul 24 Javascript
JS获取单击按钮单元格所在行的信息
Jun 17 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
Oct 29 Javascript
js函数与php函数的区别实例浅析
Jan 12 Javascript
jQuery简单几行代码实现tab切换
Mar 10 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
AngularJS表格详解及示例代码
Aug 17 Javascript
微信小程序实现时间进度条功能
Nov 17 Javascript
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
vue-cli设置css不生效的解决方法
Feb 07 #Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 #Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 #Javascript
JavaScript实现Excel表格效果
Feb 07 #Javascript
js实现自动播放匀速轮播图
Feb 06 #Javascript
node爬取新型冠状病毒的疫情实时动态
Feb 06 #Javascript
vue 检测用户上传图片宽高的方法
Feb 06 #Javascript
You might like
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
详解VUE 数组更新
2017/12/16 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
Python装饰器用法实例总结
2018/05/26 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
Django权限控制的使用
2021/01/07 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
英国家用电器购物网站:Hughes
2018/02/23 全球购物
介绍一下#error预处理
2015/09/25 面试题
what is the difference between ext2 and ext3
2013/11/03 面试题
入党积极分子介绍信
2014/01/17 职场文书
教师个人自我评价范文
2014/04/13 职场文书
新闻稿怎么写
2015/07/18 职场文书
通讯稿范文
2015/07/22 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
PHP控制循环操作的时间
2021/04/01 PHP