详解关于element el-button使用$attrs的一个注意要点


Posted in Javascript onNovember 09, 2018

之前需要对 el-button 做二次封装,所以就用到 vue$attrs$listeners 属性,这两个属性在这不细说,可以在这里 查看详情。

二次封装代码(limit-button)

<template>
 <el-button
   v-show="validButton"
   v-bind="$attrs"
   v-on="$listeners"
 >
  <slot></slot>
 </el-button>
</template>

<script>
import { mapGetters } from 'vuex';
import env from '@/config/env';

export default {
 props: {
  // 按钮唯一标识
  buttonId: {
   type: String,
   required: true,
  },
 },

 computed: {
  ...mapGetters(['getUserBtns']),
  validButton: function() {
   return env.debug ? true : this.getUserBtns[this.buttonId];
  },
 },
};
</script>

这样封装的好处就是不需要将上层每个属性都写一次 prop 定义,对 listeners 也不需要做一层中转 emit

发现问题

在某个页面,点击经过封装的 limit-button 会使页面进行刷新

起初以为是点击事件的冒泡产生的,就把上层引用的 @click 去掉:

<limit-button
  type="warning"
  size="small"
  buttonId="2345434fg"
>
点击
</limit-button>

发现还是一样会产生刷新的事件。

思考可能是 $listeners 的问题,在 mounted 中打印也只有 @click 事件,就算去掉 $listeners 也不管用。 后来在浏览器对dom结构的查看,发现 limit-button 编译后变成:

详解关于element el-button使用$attrs的一个注意要点 

可以看到编译后的 type 变成了 warning ,查 element 的源码可发现

<button
  class="el-button"
  @click="handleClick"
  :disabled="buttonDisabled || loading"
  :autofocus="autofocus"
  :type="nativeType"
  ...
 >
  <i class="el-icon-loading" v-if="loading"></i>
  <i :class="icon" v-if="icon && !loading"></i>
  <span v-if="$slots.default"><slot></slot></span>
</button>

可发现是 $attrs 覆盖了 el-button 的nativeType

问题简化重现

<el-form ref="form" :model="form" label-width="80px">
 <el-form-item>
  <button type="primary">点击会刷新</button>
  <button type="button" @click="onSubmit">点击不会刷新</button>
 </el-form-item>
</el-form>

重现链接

解决方法

type 分出来 props ,然后再通过 prop 引用

<template>
 <el-button
   :type="type"
   v-show="validButton"
   v-bind="$attrs"
   v-on="$listeners"
 >
  <slot></slot>
 </el-button>
</template>

<script>
import { mapGetters } from 'vuex';
import env from '@/config/env';

export default {
 props: {
  // 按钮唯一标识
  buttonId: {
   type: String,
   required: true,
  },
  type: {
    type: String,
  }
 },

 computed: {
  ...mapGetters(['getUserBtns']),
  validButton: function() {
   return env.debug ? true : this.getUserBtns[this.buttonId];
  },
 },
};
</script>

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

Javascript 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
jquery 防止表单重复提交代码
Jan 21 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
微信和qq时间格式模板实例详解
Oct 21 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
详解基于webpack和vue.js搭建开发环境
Apr 05 Javascript
vue-router重定向不刷新问题的解决
Jun 25 Javascript
如何自定义微信小程序tabbar上边框的颜色
Jul 09 Javascript
webpack4.x CommonJS模块化浅析
Nov 09 #Javascript
angular4笔记系列之内置指令小结
Nov 09 #Javascript
node版本管理工具n包使用教程详解
Nov 09 #Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
Nov 08 #Javascript
vue.js层叠轮播效果的实例代码
Nov 08 #Javascript
vue-cli 构建骨架屏的方法示例
Nov 08 #Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
Nov 08 #Javascript
You might like
使用PHP和XSL stylesheets转换XML文档
2006/10/09 PHP
很实用的一个完整email发送程序
2006/10/09 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
简单学习vue指令directive
2016/11/03 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
python单链表实现代码实例
2013/11/21 Python
python实现异步回调机制代码分享
2014/01/10 Python
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Flask之请求钩子的实现
2018/12/23 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
基于python 取余问题(%)详解
2020/06/03 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
python温度转换华氏温度实现代码
2020/12/06 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
哪些情况下不应该使用索引
2015/07/20 面试题
个人工作表现评语
2014/04/30 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
工地食品安全责任书
2015/05/09 职场文书
Python 全局空间和局部空间
2022/04/06 Python