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

栏目: JavaScript · 发布时间: 6年前

内容简介:之前需要对这样封装的好处就是不需要将上层每个属性都写一次在某个页面,点击经过封装的

之前需要对 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 会使页面进行刷新

  1. 起初以为是点击事件的冒泡产生的,就把上层引用的 @click 去掉:
<limit-button
    type="warning"
    size="small"
    buttonId="2345434fg"
>
点击
</limit-button>
复制代码

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

  1. 思考可能是 $listeners 的问题,在 mounted 中打印也只有 @click 事件,就算去掉 $listeners 也不管用。
  2. 后来在浏览器对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>

复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络英雄传

网络英雄传

郭羽、刘波 / 江苏凤凰文艺出版社 / 2018-6 / 59.80元

“商战鬼才郭羽、营销奇才刘波强强联手,凝集十年实战经验,倾力打造商战巨作。” 这是一个商业竞争和资本激战交织的惊心动魄的创业交锋故事。 由郭天宇、刘帅共同创立的在线旅游公司万全天盛凭借其出色的商业模式异军突起,与老牌巨头“51旅游网”两强相争,但国际巨头通远来势汹汹,国内在线旅游市场进入战火纷飞的“三国杀”时代,分踞杭、沪、京三地互相“搏杀”。中国新兴的互联网公司面对国际巨头的入侵,毫不退缩......一起来看看 《网络英雄传》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具