详解为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 相关文章推荐
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
VC调用javascript的几种方法(推荐)
Aug 09 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
Feb 28 Javascript
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
gulp安装以及打包合并的方法教程
Nov 19 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
微信小程序自定义toast弹窗效果的实现代码
Nov 15 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 syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
jquery控制页面部分刷新的方法
2015/06/24 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
应届生求职推荐信
2013/10/28 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
计算机网络专业求职信
2014/06/05 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
2014年纠风工作总结
2014/12/08 职场文书
建筑工程催款函
2015/06/24 职场文书
英语读书笔记
2015/07/02 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python