最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端框架之封裝Vue第三方組件三個技巧

 更新時間:2022年07月11日 16:03:14   作者:紅塵煉心  
這篇文章主要為大家介紹了前端框架封裝Vue第三方組件的三個技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

在封裝第三方組件中,經(jīng)常會遇到一個問題,如何通過封裝的組件去使用第三方組件的Attributes(屬性)、Events(自定義事件)、Methods(方法)、Slots(插槽)。

當然這個問題并不是難以解決,用普通方法解決難免陷入繁瑣重復的工作中,而且封裝的組件代碼可讀性也不高。

本專欄將介紹三種技巧來使用第三方組件的Attributes(屬性)、Events(自定義事件)、Slots(插槽),至于使用第三方組件的Methods(方法)的技巧還待優(yōu)化。

一、使用第三方組件的屬性

封裝一個elementUI的el-input輸入框組件稱為myInput,若要在myInput組件上添加一個disabled屬性來禁用輸入框,要如何實現(xiàn)呢?一般同學會這么做

//myInput.vue
<template>
  <div>
    <el-input v-model="inputVal" :disabled="disabled"></el-input>
  </div>
</template>
<script>
export default {
  props: {
    value: {
      type: String,
      default: '',
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    inputVal: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('input', val);
      }
    }
  }
}
</script>

過一段時間后又要在myInput組件上添加el-input組件的其它屬性,el-input組件總共有27個多屬性,那該怎么呢,難道一個個用prop傳進去,這樣不僅繁瑣而且可讀性差,可以用$attrs一步到位,先來看一下attrs的官方定義。

$attrs: 包含了父作用域中不作為 prop 被識別 (且獲取) 的 attribute 綁定 (class 和 style 除外)。當一個組件沒有聲明任何prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件

//myInput.vue
<template>
  <div>
    <el-input v-model="input" v-bind="$attrs"></el-input>
  </div>
</template>

這還不夠,還得把inheritAttrs選項設置為false,為什么呢,來看一下inheritAttrs選項的官方定義就明白了。

默認情況下父作用域的不被認作 props 的 attribute 綁定 (attribute bindings) 將會“回退”且作為普通的 HTML attribute 應用在子組件的根元素上。當撰寫包裹一個目標元素或另一個組件的組件時,這可能不會總是符合預期行為。

通過設置 inheritAttrsfalse,這些默認行為將會被去掉。而通過 $attrs 可以讓這些 attribute 生效,且可以通過 v-bind 顯性的綁定到非根元素上。注意:這個選項不影響 class 和 style 綁定。

簡單來說,把inheritAttrs設置為false,避免給myInput組件設置的屬性被添加到myInput組件的根元素div上。

//myInput.vue
<template>
  <div>
    <el-input v-model="input" v-bind="$attrs"></el-input>
  </div>
</template>
<script>
export default {
  inheritAttrs: false,
  props: {
    value: {
      type: String,
      default: '',
    },
  },
  computed: {
    inputVal: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('input', val);
      }
    }
  }
}
</script>

這樣設置后,在myInput組件上就可以直接使用el-input組件的屬性,不管后續(xù)el-input組件再增加了多少個屬性。

二、使用第三方組件的自定義事件

若在myIpput組件上使用el-input組件上自定義的事件呢,可能你的第一反應是this.$emit。

//myInput.vue
<template>
  <div>
    <el-input v-model="input" v-bind="$attrs" @blur="blur"></el-input>
  </div>
</template>
<script>
export default {
  inheritAttrs: false,
  props: {
    value: {
      type: String,
      default: '',
    },
  },
  computed: {
    inputVal: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('input', val);
      }
    }
  },
  methods: {
    blur() {
      this.$emit('blur')
    }
  }
}
</script>
<myInput v-model="value" @blur="handleBlur"></myInput>

el-input組件有4個自定義事件,還不算多,假如遇到自定義事件更多的第三方組件,要怎么辦,難道一個一個添加進去,這樣會增加一堆非必要的methods,其實可以用$listeners一步到位,先來看一下$listeners的官方定義。

$listeners:包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器。它可以通過 v-on="$listeners" 傳入內(nèi)部組件。

//myInput.vue
<template>
  <div>
    <el-input v-model="input" v-bind="$attrs" v-on="$listeners"></el-input>
  </div>
</template>

那么在myInput組件中給el-input組件添加上v-on="$listeners",就可以在myInput組件上使用el-input組件自定義的事件。

三、使用第三方組件的插槽

若在myIpput組件上使用el-input組件上定義的插槽呢?這個沒有多少取巧的方法,第三方組件定義多少個插槽,在封裝的時候都得用slot標簽暴露出去。比如暴露el-input組件中的prefix插槽,代碼如下所示:

//myInput.vue
<template>
  <div>
    <el-input v-model="input" v-bind="$attrs" @blur="blur">
      <template #prepend>
        <slot name="prepend"></slot>
      </template>
    </el-input>
  </div>
</template>

四、使用第三方組件的方法

利用ref來實現(xiàn),首先在myInput組件中的el-input組件上添加一個ref="elInput"屬性,

//myInput.vue
<template>
  <div>
    <el-input ref="elInput></el-input>
  </div>
</template>
<script>
export default {
  mounted(){
     this.elInput = this.$refs.elInput;
  }
}
</script>

這里要注意父子組件的mounted的執(zhí)行時機,因為一般el-input組件是全局引入的,相當同步引入組件,此時el-input組件的mounted會比myInput組件的mounted先執(zhí)行,所以可以在myInput組件的mounted中把this.$refs.elInput賦值到myInput組件的this的一個屬性上。

myInput組件如何使用el-input組件的方法分兩種情況,跟myInput組件的引入有關(guān)系。

假如myInput組件是同步引入的

<template>
  <div>
    <myInput ref="myInput"></myInput>
  </div>
</template>
<script>
import myInput from './myInput.vue';
export default {
  data() {
    return {
    }
  },
  components: {
    myInput,
  },
  mounted() {
    //調(diào)用el-input組件的focus方法
    this.$refs.myInput.elInput.focus();
  }
}
</script>

假如myInput組件是異步引入的

<template>
  <div>
    <myInput ref="myInput"></myInput>
  </div>
</template>
<script>
export default {
  data() {
    return {
    }
  },
  components: {
    myInput: () => import('./myInput.vue')
  },
  mounted() {
    //調(diào)用el-input組件的focus方法
    setTimeout(() => {
       this.$refs.myInput.elInput.focus();
    })
  }
}
</script>

以上就是前端框架封裝Vue第三方組件三個技巧的詳細內(nèi)容,更多關(guān)于封裝Vue第三方組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Vue demo實現(xiàn)商品列表的展示

    詳解Vue demo實現(xiàn)商品列表的展示

    這篇文章主要介紹了Vue demo實現(xiàn)商品列表的展示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • vue2實現(xiàn)無感刷新token的方式詳解

    vue2實現(xiàn)無感刷新token的方式詳解

    在Web應用中,用戶需要通過認證和授權(quán)才能訪問受保護的資源,為了實現(xiàn)認證和授權(quán)功能,通常需要使用Token來標識用戶身份并驗證其權(quán)限,本文給大家介紹了vue2實現(xiàn)無感刷新token的方式,需要的朋友可以參考下
    2024-02-02
  • Vue中router-link常用屬性使用案例講解

    Vue中router-link常用屬性使用案例講解

    這篇文章主要介紹了Vue中router-link常用屬性使用案例講解,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • vue.js中ref和$refs的使用及示例講解

    vue.js中ref和$refs的使用及示例講解

    這篇文章主要給大家介紹了關(guān)于vue.js中ref和$refs使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Vue全局使用less樣式,組件使用全局樣式文件中定義的變量操作

    Vue全局使用less樣式,組件使用全局樣式文件中定義的變量操作

    這篇文章主要介紹了Vue全局使用less樣式,組件使用全局樣式文件中定義的變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • VUE v-for循環(huán)中每個item節(jié)點動態(tài)綁定不同函數(shù)的實例

    VUE v-for循環(huán)中每個item節(jié)點動態(tài)綁定不同函數(shù)的實例

    今天小編就為大家分享一篇VUE v-for循環(huán)中每個item節(jié)點動態(tài)綁定不同函數(shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue3引入騰訊地圖包含標注簡易操作指南

    Vue3引入騰訊地圖包含標注簡易操作指南

    這篇文章主要介紹了Vue3引入騰訊地圖的相關(guān)資料,并實現(xiàn)點擊地圖添加標注的功能,示例代碼提供了添加單個或多個標注的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • vue函數(shù)input輸入值請求時延遲1.5秒請求問題

    vue函數(shù)input輸入值請求時延遲1.5秒請求問題

    這篇文章主要介紹了vue函數(shù)input輸入值請求時延遲1.5秒請求問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue.directive 實現(xiàn)元素scroll邏輯復用

    Vue.directive 實現(xiàn)元素scroll邏輯復用

    這篇文章主要介紹了Vue.directive 實現(xiàn)元素scroll邏輯復用功能,文中給大家提到元素實現(xiàn)滾動的條件有兩個,具體內(nèi)容詳情大家參考下本文
    2019-11-11
  • 詳細聊聊Vue的混入和繼承

    詳細聊聊Vue的混入和繼承

    混入(mixin)是一種非常靈活的方式,用來分發(fā)Vue組件中可復用的功能,一個混入對象可以包含任意組件選項,下面這篇文章主要給大家介紹了關(guān)于Vue混入和繼承的相關(guān)資料,需要的朋友可以參考下
    2021-09-09

最新評論

萝北县| 霍山县| 临沧市| 江安县| 莒南县| 临江市| 苗栗市| 宣城市| 工布江达县| 乌拉特前旗| 井研县| 托克逊县| 开封市| 平武县| 萝北县| 明光市| 罗城| 泸溪县| 平湖市| 封丘县| 西藏| 江门市| 个旧市| 平安县| 万年县| 阳谷县| 大悟县| 天峻县| 桃园市| 区。| 巍山| 永新县| 平顶山市| 石首市| 日土县| 临颍县| 南陵县| 灯塔市| 南涧| 临泽县| 迭部县|