详解为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 相关文章推荐
js 复制或插入Html的实现方法小结
May 19 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
Mar 29 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
May 02 Javascript
vuejs2.0子组件改变父组件的数据实例
May 10 Javascript
iview给radio按钮组件加点击事件的实例
Sep 30 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
小程序登录态管理的方法示例
Nov 13 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
Apr 28 Javascript
layui table单元格事件修改值的方法
Sep 24 Javascript
基于javascript实现日历功能原理及代码实例
May 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
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
php简单的上传类分享
2016/05/15 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
学生周末长期请假条
2014/02/15 职场文书
申论倡议书范文
2014/05/13 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
前台岗位职责范本
2015/04/16 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL