详解关于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 相关文章推荐
js实现向右横向滑出的二级菜单效果
Aug 27 Javascript
Web打印解决方案之普通报表打印功能
Aug 29 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
Dec 24 Javascript
DropDownList控件绑定数据源的三种方法
Dec 24 Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
webpack4.x打包过程详解
Jul 18 Javascript
Vue左滑组件slider使用详解
Aug 21 Javascript
微信小程序实现电影App导航和轮播
Nov 30 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分页类的代码
2011/05/18 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
连接Python程序与MySQL的教程
2015/04/29 Python
python中字符串类型json操作的注意事项
2017/05/02 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Python数据结构之图的应用示例
2018/05/11 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
Python内存映射文件读写方式
2020/04/24 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
HTML5标签大全
2016/11/23 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
运动会入场式解说词
2014/02/18 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
Jsonp劫持学习
2021/04/01 PHP
浅谈pytorch中的dropout的概率p
2021/05/27 Python