91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解關于element el-button使用$attrs的一個注意要點

發布時間:2020-09-06 19:36:46 來源:腳本之家 閱讀:175 作者:天驅 欄目:web開發

之前需要對 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>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鞍山市| 霍州市| 日土县| 南乐县| 宝兴县| 澄迈县| 佛坪县| 郧西县| 台南县| 扶绥县| 阜平县| 泸溪县| 曲麻莱县| 揭阳市| 天台县| 班戈县| 莲花县| 什邡市| 清苑县| 兴安盟| 化州市| 林芝县| 青海省| 清河县| 榆树市| 黄浦区| 东辽县| 故城县| 三都| 镇康县| 洞口县| 阳谷县| 龙山县| 庆云县| 灵寿县| 营山县| 开封市| 农安县| 云浮市| 原平市| 梁平县|