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

Vue封裝組件利器之$attrs、$listeners的使用

 更新時間:2021年12月28日 10:47:58   作者:畢了業(yè)就退休  
vue通信手段有很多種,props/emit、vuex、event bus、provide/inject等,還有一種通信方式,那就是$attrs和$listeners,下面這篇文章主要給大家介紹了關(guān)于Vue封裝組件利器之$attrs、$listeners使用的相關(guān)資料,需要的朋友可以參考下

前言

多級組件嵌套需要傳遞數(shù)據(jù)時,通常使用的方法是通過vuex。但僅僅是傳遞數(shù)據(jù),不做中間處理,使用 vuex 處理,未免有些大材小用了。所以就有了 $attrs 、 $listeners兩個屬性 ,通常配合 inheritAttrs 一起使用。

$attrs

從父組件傳給自定義子組件的屬性,如果沒有 prop 接收會自動設(shè)置到子組件內(nèi)部的最外層標(biāo)簽上,如果是 class 和 style 的話,會合并最外層標(biāo)簽的 class 和 style。

如果子組件中不想繼承父組件傳入的非 prop 屬性,可以使用 inheritAttrs 禁用繼承,然后通過 v-bind="$attrs" 把外部傳入的 非 prop 屬性設(shè)置給希望的標(biāo)簽上,但是這不會改變 class 和 style。

inheritAttrs 屬性 官網(wǎng)鏈接

2.4.0 新增

類型:boolean

默認(rèn)值:true

詳細(xì):

默認(rèn)情況下父作用域的不被認(rèn)作 props 的 attribute 綁定 (attribute bindings) 將會“回退”且作為普通的 HTML attribute 應(yīng)用在子組件的根元素上。當(dāng)撰寫包裹一個目標(biāo)元素或另一個組件的組件時,這可能不會總是符合預(yù)期行為。通過設(shè)置 inheritAttrs 到 false,這些默認(rèn)行為將會被去掉。而通過 (同樣是 2.4 新增的) 實例 property $attrs 可以讓這些 attribute 生效,且可以通過 v-bind 顯性的綁定到非根元素上。

注意:這個選項不影響 class 和 style 綁定。

例子:

父組件

<template>
  <my-input
      required
      placeholder="請輸入內(nèi)容"
      type="text"
      class="theme-dark"
  />
</template>

<script>
import MyInput from './child'
export default {
  name: 'parent',
  components: {
    MyInput
  }
}
</script>

子組件

<template>
  <div>
    <input
        v-bind="$attrs"
        class="form-control"
    />
  </div>
</template>

<script>
export default {
  name: 'MyInput',
  inheritAttrs: false
}
</script>

子組件中沒有接受父組件中傳過來的值,也沒有綁定,但是有v-bind="$attrs"這個屬性,他會自動接受并綁定

inheritAttrs: false

inheritAttrs: true

$listeners (官網(wǎng)解釋)

listeners: 包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器。它可以通過 v-on="$listeners" 傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時非常有用。

先上代碼:這里只舉例focue、input兩個原生事件

// 父組件
<template>
  <my-input
      required
      placeholder
      class="theme-dark"
      @focue="onFocus"
      @input="onInput"
  >
  </my-input>
</template>
<script>
import MyInput from './child'
export default {
  components: {
    MyInput
  },
  methods: {
    onFocus (e) {
      console.log(e.target.value)
    },
    onInput (e) {
      console.log(e.target.value)
    }
  }
}
</script>
// 子組件
<template>
  <div>
    <input
        type="text"
        v-bind="$attrs"
        class="form-control"
        @focus="$emit('focus', $event)"
        @input="$emit('input', $event)"
    />
  </div>
</template>

<script>
export default {
  name: 'MyInput',
  inheritAttrs: false
}
</script>

這樣綁定原生事件很麻煩,每一個原生事件都需要綁定,但用v-on="$listeners"就會省事很多

 <input
        type="text"
        v-bind="$attrs"
        class="form-control"
+       v-on="$listeners"
-       @focus="$emit('focus', $event)"
-       @input="$emit('input', $event)"
    />

這樣一行代碼就能解決綁定所有的原生事件的問題

使用場景

組件傳值時使用: 爺爺在父親組件傳遞值,父親組件會通過$attrs獲取到不在父親props里面的所有屬性,父親組件通過在孫子組件上綁定$attrs 和 $listeners 使孫組件獲取爺爺傳遞的值并且可以調(diào)用在爺爺那里定義的方法;

對一些UI庫進(jìn)行二次封裝時使用:比如element-ui,里面的組件不能滿足自己的使用場景的時候,會二次封裝,但是又想保留他自己的屬性和方法,那么這個時候時候$attrs和$listners是個完美的解決方案。

總結(jié)

到此這篇關(guān)于Vue封裝組件利器之$attrs、$listeners使用的文章就介紹到這了,更多相關(guān)Vue封裝組件$attrs、$listeners使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue源碼學(xué)習(xí)之響應(yīng)式是如何實現(xiàn)的

    Vue源碼學(xué)習(xí)之響應(yīng)式是如何實現(xiàn)的

    最近接觸了vue.js,一度非常好奇vue.js是如何監(jiān)測數(shù)據(jù)更新并且重新渲染頁面,這篇文章主要給大家介紹了關(guān)于Vue源碼學(xué)習(xí)之響應(yīng)式是如何實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • elementplus?中?DatePicker?日期選擇器樣式修改無效的問題及解決方案

    elementplus?中?DatePicker?日期選擇器樣式修改無效的問題及解決方案

    這篇文章主要介紹了elementplus中DatePicker日期選擇器樣式修改無效的問題,DatePicker日期選擇器彈出面板默認(rèn)掛載在body上,所以在組件中添加了?scoped?屬性的?style?標(biāo)簽下是修改不到其樣式的,講解了datepicker的使用方法,及常見的配置項和對應(yīng)的值,需要的朋友可以參考下
    2024-01-01
  • Vue中使用addEventListener添加事件、removeEventListener移除事件的示例詳解

    Vue中使用addEventListener添加事件、removeEventListener移除事件的示例詳解

    最近在項目中需要用到addEventListener監(jiān)聽滾動條滾動的高度,所以就研究了一下在vue中是怎么進(jìn)行事件監(jiān)聽的,添加事件和移除事件結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-12-12
  • vue使用xlsx導(dǎo)入到表格中示例代碼

    vue使用xlsx導(dǎo)入到表格中示例代碼

    這篇文章主要介紹了vue使用xlsx導(dǎo)入到表格中代碼,具體實現(xiàn)是先通過FileReader將上傳的文件讀取為二進(jìn)制數(shù)據(jù),然后使用xlsx將它解析成JSON數(shù)據(jù),最后將JSON數(shù)據(jù)填充到表格中,需要的朋友可以參考下
    2023-11-11
  • Vue.js的兄弟組件傳值實現(xiàn)組件間互動

    Vue.js的兄弟組件傳值實現(xiàn)組件間互動

    在Vue.js中,組件是構(gòu)建用戶界面的基本單位,而兄弟組件傳值是組件間交互的重要組成部分,本文將探討兄弟組件傳值的方法和優(yōu)勢,并通過有趣的示例展示其強大的功能,需要的朋友可以參考下
    2025-03-03
  • 前端vue實現(xiàn)甘特圖功能

    前端vue實現(xiàn)甘特圖功能

    dhtmlxGantt是一個強大的JavaScript Gantt圖表庫,提供易于使用、高度可自定義的Gantt圖表組件,它支持多項任務(wù)和進(jìn)度條,以及多種列和行布局,可用于創(chuàng)建各種類型的時間線和計劃表,本文給大家介紹前端vue實現(xiàn)甘特圖的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • vuejs+element UI點擊編輯表格某一行時獲取內(nèi)容填入表單的示例

    vuejs+element UI點擊編輯表格某一行時獲取內(nèi)容填入表單的示例

    這篇文章主要介紹了vuejs+element UI點擊編輯表格某一行時獲取內(nèi)容填入表單的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Vue滑塊解鎖組件使用方法詳解

    Vue滑塊解鎖組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue滑塊解鎖組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue中PC端使用高德地圖實現(xiàn)搜索定位、地址標(biāo)記、彈窗顯示定位詳情(完整實例)

    vue中PC端使用高德地圖實現(xiàn)搜索定位、地址標(biāo)記、彈窗顯示定位詳情(完整實例)

    這篇文章主要介紹了vue中PC端使用高德地圖實現(xiàn)搜索定位、地址標(biāo)記、彈窗顯示定位詳情,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 在同一個Vue項目中的不同vue和HTML頁面之間進(jìn)行跳轉(zhuǎn)方式

    在同一個Vue項目中的不同vue和HTML頁面之間進(jìn)行跳轉(zhuǎn)方式

    這篇文章主要介紹了在同一個Vue項目中的不同vue和HTML頁面之間進(jìn)行跳轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論

上虞市| 和平区| 齐齐哈尔市| 无为县| 湟中县| 喀喇沁旗| 永川市| 富源县| 犍为县| 平乐县| 平果县| 田林县| 吉林市| 霸州市| 金塔县| 博乐市| 崇左市| 海门市| 沧源| 巴青县| 通山县| 顺平县| 砚山县| 五河县| 吉木萨尔县| 双城市| 德钦县| 临安市| 喜德县| 炎陵县| 临西县| 泸溪县| 体育| 依兰县| 双牌县| 花莲市| 二连浩特市| 镇康县| 五家渠市| 长武县| 满洲里市|