详解为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 相关文章推荐
DOM下的节点属性和操作小结
May 14 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
深入浅析JS中的严格模式
Jun 04 Javascript
react-native android状态栏的实现
Jun 15 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
vue实现动态按钮功能
May 13 Javascript
Vue中props的详解
May 16 Javascript
vue 项目引入echarts 添加点击事件操作
Sep 09 Javascript
javascript canvas封装动态时钟
Sep 30 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 Javascript
JavaScript原型链详解
Nov 07 Javascript
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
东方红 - 来复式再生机的修复
2021/03/02 无线电
自定义session存储机制避免会话保持问题
2014/10/08 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
js 可拖动列表实现代码
2011/12/13 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
Python读取图片属性信息的实现方法
2016/09/11 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
python实现批处理文件
2020/07/28 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
浅析Python的命名空间与作用域
2020/11/25 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
公司出纳岗位职责
2013/12/07 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
教师职称自我鉴定
2014/02/12 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
Redis分布式锁的7种实现
2022/04/01 Redis
拙作再改《我的收音机情缘》
2022/04/05 无线电
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS