详解关于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 相关文章推荐
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
Mar 19 Javascript
jquery实现可关闭的倒计时广告特效代码
Sep 02 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
Apr 01 Javascript
BootStrap扔进Django里的方法详解
May 13 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
Jun 07 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
谈谈第三方App接入微信登录 解读
Dec 27 Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 Javascript
ECMAScript6--解构
Mar 30 Javascript
WdatePicker.js时间日期插件的使用方法
Jul 26 Javascript
jquery实现选项卡切换代码实例
May 14 jQuery
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中time()和mktime()方法的区别
2013/09/28 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
JavaScript知识点整理
2015/12/09 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
浅析Python 中整型对象存储的位置
2016/05/16 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
Python如何定义接口和抽象类
2020/07/28 Python
python如何调用php文件中的函数详解
2020/12/29 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
初中校园广播稿
2014/02/02 职场文书
优秀幼教自荐信
2014/02/03 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书