详解关于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 相关文章推荐
用javascript动态调整iframe高度的方法
Mar 06 Javascript
JavaScript中的类(Class)详细介绍
Dec 30 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
Mar 13 Javascript
jQuery提示插件alertify使用指南
Apr 21 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
Oct 24 Javascript
jQuery删除当前节点元素
Dec 07 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
node.js express中app.param的用法详解
Jul 16 Javascript
Javascript刷新页面的实例
Sep 23 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
May 08 Javascript
js与jquery获取input输入框中的值实例讲解
Feb 27 jQuery
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP 文件类型判断代码
2009/03/13 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
EasyUI实现下拉框多选功能
2017/11/07 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
Python3遍历目录树实现方法
2015/05/22 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python管理Windows服务小脚本
2018/03/12 Python
Django接收自定义http header过程详解
2019/08/23 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
一套VC试题
2015/01/23 面试题
2014司机年终工作总结
2014/12/05 职场文书
活动简报范文
2015/07/22 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技