详解关于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 相关文章推荐
jquery uaMatch源代码
Feb 14 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 Javascript
Jquery动态改变图片IMG的src地址示例
Jun 25 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
微信小程序之页面拦截器的示例代码
Sep 07 Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
页面点击小红心js实现代码
May 26 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
Apr 29 Javascript
微信小程序实现菜单左右联动
May 19 Javascript
vue+canvas实现移动端手写签名
May 21 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
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python Process多进程实现过程
2019/10/22 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
python打包多类型文件的操作方法
2020/09/21 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
美国旅游网站:Tours4Fun
2017/02/17 全球购物
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
劳动实践课感言
2014/02/01 职场文书
班长竞选演讲稿
2014/04/24 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
2015年学校政教工作总结
2015/07/20 职场文书