精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue 這個透傳技巧,治好了我的重度代碼潔癖

開發 前端
今天就用一個Vue基礎組件封裝的過程為例,來簡單聊聊什么是透傳。

 背景介紹

透傳是一個通訊層面的概念,指的是在通訊中不管傳輸的業務內容如何,只負責將傳輸的內容由源地址傳輸到目的地址,而不對業務數據內容做任何改變。

其實透傳這個概念,我最早是從上面一個領導那里聽到的,由于他是電氣工程師出身,而硬件通訊這塊用到透傳還是挺多的。

對于透傳,我感覺有那么一點熟悉感,仔細想想后我發現,其實我們前端也一直在使用透傳,特別是在做基礎封裝時。

透傳在前端的應用

今天就用一個Vue基礎組件封裝的過程為例,來簡單聊聊什么是透傳。

相信不少前端er做項目都會用到組件庫,是ElementUI還是Ant Design,這都不重要。然后我們又希望在第三方組件庫的基礎上再做一點點定制。

舉個例子,el-button有個屬性是size,用于控制按鈕組件的尺寸。

屬性 說明 類型 可選值 默認值
size 尺寸 String medium / small / mini -


可以看到,默認size是比較大的。然而我們設計師基于組件庫出自己的設計方案時,其實選擇的默認按鈕尺寸可能恰好對應ElButton的medium尺寸,或者是其他值。這樣一來,如果我不對el-button做封裝,每個使用el-button的地方都要多寫一個屬性size,類似于這樣: 

  1. // pageA.vue  
  2. <el-button size="medium">按鈕1</el-button>  
  3. <el-button size="medium">按鈕2</el-button>  
  4. // pageB.vue  
  5. <el-button size="medium">按鈕3</el-button>  
  6. <el-button size="medium">按鈕4</el-button> 

很明顯,每使用一次el-button,我就要寫一個size屬性,好煩啊!

是的,確實很煩,那么怎么解決呢?答案是提供一個編程接口,去改變組件的默認值。有這方面考慮的組件設計者一般會提供一個設置默認值的接口,比如xxx.setDefault(options)。

那么ElementUI和Ant Design有沒有提供這樣的能力呢?據我觀察好像是沒有,其實主要是因為Vue沒有一個方便的途徑去修改prop的default屬性。但是沒有方便的途徑并不代表沒有途徑...

由于本文的主題是透傳,所以就不說那個途徑(或者說方法)了,有點跑偏了。

網友小王說:“好,那就硬上,封裝一個組件!”

好的,馬上安排!基本思路是封裝一個自定義組件,組件里面再調用el-button,并且強行給el-button安排上默認屬性size="medium"。 

  1. <template>  
  2.     <el-button :size="size">  
  3.         <slot />  
  4.     </el-button>  
  5. </template>  
  6. <script>  
  7. export default {  
  8.     name: "MyButton",  
  9.     props: {  
  10.         size: {  
  11.             type: String,  
  12.             default: 'medium'  
  13.         }  
  14.     }  
  15.  
  16. </script> 

聰明的讀者一看就發現了,這個組件問題很大,除了size屬性,其他屬性和事件怎么處理完全沒

小王說:“沒事,您需要什么?我給安排上!”

于是,這個組件最后就慢慢變成了: 

  1. <template>  
  2.     <el-button  
  3.         :size="size"  
  4.         :type="type"  
  5.         :disabled="disabled"  
  6.         @click="onClick"  
  7.     >  
  8.         <slot />  
  9.     </el-button>  
  10. </template>  
  11. <script>  
  12. export default {  
  13.     name: "MyButton", 
  14.     props: {  
  15.         size: {  
  16.             type: String,  
  17.             default: "medium",  
  18.         },  
  19.         type: {  
  20.             type: String,  
  21.             default: "primary",  
  22.         },  
  23.         disabled: Boolean,  
  24.     },  
  25.     methods: {  
  26.         onClick() {  
  27.             this.$emit("click");  
  28.         },  
  29.     },  
  30. };  
  31. </script> 

看起來有點糟心,這組件甚至會更冗余,更復雜,因為我這里只加了3個prop和1個event。對于稍微復雜一點的組件來說,prop加上event一共幾十個是隨隨便便的吧!你適配得過來嗎?而且,不少人還有代碼潔癖吧,這簡直受不了!

淡定淡定!這當然是有辦法解決的。強如框架的設計者尤小右自然早已想到了這個場景,所以你應該在Vue官網文檔中關注到inheritAttrs[1]。

如何理解inheritAttrs(默認值為true)這個選項呢?我們知道,一個組件如果要接受父組件傳來的屬性,是需要先在props里面預定義好的。比如前面的例子,我在MyButton預定義了3個屬性,分別是size,type,disabled,意思是MyButton這里只接受3個prop。

那么假設父組件傳了4個或者更多prop過來呢,會怎么樣?看下面這個例子: 

  1. <template>  
  2.     <my-button  
  3.         type="success"  
  4.         disabled  
  5.         round  
  6.         native-type="submit"  
  7.     >測試</my-button>  
  8. </template> 

實際上,round和autofocus都不是MyButton組件支持的prop,所以反映到HTML上是這么一個效果:

作為使用者,我們應該是希望round和native-type="submit"能夠傳到el-button,產生應有的效果。然而,round和native-type="submit"僅僅是掛在了根元素的attribute上,并沒有真正起到應有的作用!

PS:舉個例子,round屬性作用到el-button能讓button帶一個is-round的class,從而產生圓角效果!

也就是說,inheritAttrs的作用是:使那些沒有在props中定義的屬性,直接以attribute的形式作用在組件的根元素上!

那么round和native-type="submit"如何透傳下去呢?

首先,不能讓那些未被props標識的屬性直接落到根元素上,所以需要設置inheritAttrs為false。

然后,要獲取到那些未被props標識的屬性,并直接綁定到el-button。恰好,Vue提供了$attrs[2]用于獲取這些屬性,而v-bind本身就能綁定一個對象,這是容易被我們忽略的!

處理完屬性透傳,接下來我們還要處理事件,類似于$attrs,$listeners也能把父組件中對子組件的事件監聽全部拿到,這樣我們就能用一個v-on把這些來自于父組件的事件監聽傳遞到下一級組件。

看圖可能會更好理解!

相當于MyButton是一個不賺差價的中間商,直接透傳消息!直觀上看,組件代碼量有一個明顯的減少,更重要的是擴展性和可維護性變得更強! 

  1. <template>  
  2.     <el-button  
  3.         v-bind="customizedAttrs"  
  4.         v-on="$listeners"  
  5.     >  
  6.         <slot />  
  7.     </el-button>  
  8. </template>  
  9. <script>  
  10. export default {  
  11.     name: "MyButton",inheritAttrs:false,  
  12.     props: {  
  13.         size: {  
  14.             type: String, 
  15.             default: "medium",  
  16.         },  
  17.     },  
  18.     computed: {  
  19.         customizedAttrs() {  
  20.             return {  
  21.                 size: "medium",  
  22.                 // 支持傳過來的size覆蓋默認的size  
  23.                 ...this.$attrs,  
  24.             };  
  25.         },  
  26.     },  
  27. };  
  28. </script> 

對于調用者來說,使用體驗是完全沒有被影響的,他的感覺就好像仍然在直接使用el-button,屬性傳遞和事件監聽的使用體驗都沒有任何變化! 

  1. <template>  
  2.     <my-button  
  3.         type="success"  
  4.         round  
  5.         autofocus  
  6.         @click="handleClick"  
  7.     />  
  8. </template> 

總結

結合inheritAttrs,v-bind以及v-on,我們就實現了一個支持透傳的基礎組件!本文是以Button組件為例,做的關于透傳的入門介紹。實際上,透傳的應用范圍遠遠不止Button組件,利用透傳的技巧,我們能做更多漂亮的事情!現在,你的代碼潔癖還好嗎? 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2025-08-12 00:02:10

CSS屬性字體

2025-04-17 04:22:00

Log插件日志管理

2022-08-31 15:57:11

程序員

2022-09-17 08:10:20

HSV飽和度圖像

2023-07-10 09:53:59

console開發插件

2025-04-23 08:02:44

2020-05-09 08:09:36

中臺阿里平臺

2020-10-23 09:50:20

鏈表Java代碼

2019-01-16 10:55:08

Python 開發編程語言

2019-06-26 09:20:38

Java工具Lombok

2019-08-22 15:06:56

線程Java透傳

2025-11-17 00:15:00

ChatGPT奧特曼AI

2019-10-28 11:53:34

戴爾

2021-06-18 13:58:28

ESLint Vue 項目

2019-05-05 11:02:07

vscodevue前端

2024-01-26 08:36:07

OpenAIGPT-4?人工智能

2024-12-27 15:28:10

HBAFC-SAN存儲

2019-08-01 12:56:00

Python代碼記錄

2021-02-23 09:06:00

MVCC版本并發
點贊
收藏

51CTO技術棧公眾號

美女精品视频在线| 日本中文字幕在线观看视频| 日韩福利影视| 亚洲欧洲日韩女同| 91麻豆国产精品| 欧美精品一区二区蜜桃| 国产伦乱精品| 一本到一区二区三区| 午夜精品福利一区二区| va视频在线观看| 在线观看的日韩av| 亚洲色图在线观看| www.污污视频| а_天堂中文在线| aaa亚洲精品一二三区| 欧美在线一级va免费观看| 成人在线观看免费高清| 免费观看亚洲天堂| 一本色道亚洲精品aⅴ| 亚洲乱码一区二区三区| 99精品在线看| 国产视频一区欧美| 久久九九精品99国产精品| 无码av免费精品一区二区三区| 伊人久久综合一区二区| 中文字幕视频一区| 久久99精品久久久久子伦| 亚洲一线在线观看| 亚洲激情不卡| 最新91在线视频| 中国一级特黄录像播放| 成人在线观看免费视频| 激情久久av一区av二区av三区| 一本一生久久a久久精品综合蜜 | 99热99精品| 国产精品亚洲片夜色在线| 日韩人妻无码一区二区三区99 | 精品美女在线观看视频在线观看 | 国产精品69毛片高清亚洲| 51ⅴ精品国产91久久久久久| 91麻豆免费视频网站| 亚洲国产合集| 日韩天堂在线观看| 亚洲一级片网站| 麻豆蜜桃在线观看| 亚洲综合丝袜美腿| 中文字幕久久一区| av在线免费观看网| 久久久噜噜噜久噜久久综合| 成人动漫在线视频| 国产精品特级毛片一区二区三区| 日日嗨av一区二区三区四区| 97免费视频在线播放| 欧美日韩在线观看免费| 91精品国产调教在线观看| 在线不卡国产精品| 欧美做受xxxxxⅹ性视频| 欧美黄色录像| 亚洲福利视频网| 欧美性受xxxx黒人xyx性爽| 国产亚洲精品精品国产亚洲综合| 欧美天堂在线观看| 一区二区传媒有限公司| 国产高清自产拍av在线| 午夜精品久久久| 成人精品视频在线播放| 91福利在线尤物| 亚洲午夜久久久久久久久电影院 | 美女一区视频| 黄色一级片中国| 成人羞羞网站| 亚洲欧美日韩成人| 91av在线免费| 欧美在线导航| 亚洲精品午夜精品| 在线免费观看成年人视频| 国偷自产av一区二区三区| 亚洲第一偷拍网| 黄色国产在线视频| 精品女人视频| 日韩精品视频三区| 成人免费网站黄| 亚洲综合福利| 最近2019年手机中文字幕| 国产wwwwxxxx| 一区二区蜜桃| 欧美精品电影在线| 天天综合天天干| 久久久久久一区二区| 国产成人综合av| 中文字幕人成人乱码亚洲电影| 久久精品国产精品青草| 91影视免费在线观看| 超碰免费在线97| 不卡一区二区三区四区| 欧美日韩无遮挡| av片在线看| 亚洲欧美日韩一区| 亚洲 欧美 日韩 国产综合 在线 | 亚州欧美日韩中文视频| 51国产偷自视频区视频| 免费在线观看一区二区三区| 成人国产亚洲精品a区天堂华泰| 国产suv一区二区| 成人av在线一区二区| 免费成人看片网址| 麻豆网站在线| 亚洲成人资源网| 欧美两根一起进3p做受视频| 亚洲精品伊人| 精品国产一区二区三区忘忧草| www.17c.com喷水少妇| 杨幂一区二区三区免费看视频| 中文字幕日本欧美| 欧美日韩大片在线观看| 99av国产精品欲麻豆| 国产精品久久久久久久电影 | 精品白丝av| 国产成人综合av| 99热这里只有精品在线| av欧美精品.com| 日韩av一区二区三区在线| 国产鲁鲁视频在线观看特色| 婷婷久久综合九色国产成人| 污视频网站观看| 久久精品论坛| 久久久成人av| 亚洲欧美偷拍视频| 国产精品99久| 欧美日韩无遮挡| 黄色在线观看网站| 欧美丝袜一区二区| wwwxxxx在线观看| 欧美肉体xxxx裸体137大胆| 性色av香蕉一区二区| 91精品中文字幕| 91麻豆视频网站| 国产成人艳妇aa视频在线| 成人综合网站| 亚洲欧美日韩久久久久久| 欧美日韩一级在线观看| 久久激情综合网| 国产视频精品网| 免费黄网站在线| 日本乱码高清不卡字幕| 99re这里只有| 亚洲国产精品91| 国产精品一区二区三区免费视频 | 欧美男插女视频| 国内av在线播放| av在线免费不卡| 91传媒免费视频| 99精品美女视频在线观看热舞| 亚洲色图美腿丝袜| 欧美日韩一二三四区| 国产91精品一区二区麻豆亚洲| 制服国产精品| 黑人巨大精品| 亚洲大胆人体视频| 波多野结衣不卡视频| 国产一区二区三区在线看麻豆| 欧美在线一二三区| 成人三级高清视频在线看| 日韩欧美精品三级| 日本一级二级视频| 国产一区二区三区在线看麻豆| 欧美 另类 交| 激情不卡一区二区三区视频在线| 色婷婷av一区二区三区在线观看 | 粉嫩久久久久久久极品| 欧美福利视频在线| 欧美天堂在线视频| 欧美日韩国产丝袜美女| 国产又黄又粗又猛又爽的视频| 亚洲精品乱码| 精品国产乱码久久久久久久软件| 欧洲一区精品| 亚洲人成在线一二| 中文字幕日本人妻久久久免费 | 加勒比久久高清| 91高潮精品免费porn| 美女欧美视频在线观看免费| 欧美伊人久久久久久久久影院| 人成免费在线视频| 韩国成人精品a∨在线观看| 国产精品久久久影院| 成功精品影院| 欧美一级淫片播放口| 国产香蕉在线| 欧美日韩国产123区| 欧美 日韩 国产 一区二区三区| 成人永久aaa| 免费日韩视频在线观看| 欧美独立站高清久久| 亚洲伊人久久大香线蕉av| 97天天综合网| 亚洲一品av免费观看| 国产美女www爽爽爽视频| 性久久久久久久久| 我不卡一区二区| 国产一区中文字幕| 日本一道本久久| 日韩免费一区| αv一区二区三区| 日本韩国欧美| 欧美xxxx做受欧美| 国产中文字幕在线看| 欧美一区二区二区| 日韩 国产 欧美| 亚洲精品国产视频| 麻豆精品免费视频| 国产成人亚洲综合色影视| 青青青在线播放| 午夜精品久久久久99热蜜桃导演 | 精选一区二区三区四区五区| 男人亚洲天堂| 97精品久久久中文字幕免费| 亚洲成人三级| 亚洲国产精品va在看黑人| 97精品久久人人爽人人爽| 五月激情丁香一区二区三区| 国产福利视频网站| 久久久99精品久久| 国产精品一区二区无码对白| 蓝色福利精品导航| 女人扒开屁股爽桶30分钟| 欧美激情无毛| 亚洲一区高清| 国产精品视频一区二区三区四蜜臂| julia一区二区中文久久94| 成人在线视频观看| 国产成人激情视频| 漫画在线观看av| 色综合久综合久久综合久鬼88| аⅴ资源新版在线天堂| 亚洲精品久久久久| 亚洲奶汁xxxx哺乳期| 欧美精品在线观看播放| 波多野结衣网站| 午夜天堂影视香蕉久久| 黄色一级视频免费| 亚洲欧美另类久久久精品| 欧美成人久久久免费播放| 91在线观看下载| 日韩av成人网| 国产在线一区二区| 精品亚洲一区二区三区四区| 久久亚洲视频| 国产精品一区二区免费在线观看| 国产中文一区| 少妇高潮大叫好爽喷水| 香蕉视频国产精品| 一级特黄录像免费播放全99| 欧洲乱码伦视频免费| 欧美婷婷久久| 美女久久久久| 久久99热只有频精品91密拍| 日韩欧美影院| 好吊妞www.84com只有这里才有精品| 天堂va在线高清一区| 98国产高清一区| 亚洲日本va午夜在线电影| 亚洲qvod图片区电影| 成人51免费| 96国产粉嫩美女| 一区二区三区无毛| 亚洲自拍在线观看| 一区二区在线视频观看| 动漫一区二区在线| 精品在线网站观看| 鲁丝片一区二区三区| 久久成人av| 色噜噜一区二区| 日韩电影在线视频| 日韩第一页在线观看| 欧美国产另类| 给我免费播放片在线观看| 亚洲三级免费| 国产精品-区区久久久狼| 三级在线观看一区二区| 超碰在线97免费| 久久99国产乱子伦精品免费| 超碰在线超碰在线| 成人教育av在线| 粉嫩av蜜桃av蜜臀av| 国产精品午夜春色av| 日韩视频中文字幕在线观看| 亚洲一二三区视频在线观看| 西西44rtwww国产精品| 欧洲国产伦久久久久久久| 国产又大又长又粗| 亚洲国产精品女人久久久| 男男激情在线| 久久久久999| 国产伦理精品| 国产日韩亚洲欧美| 国产精品一线| 日韩欧美手机在线| 欧美精品导航| 久久9精品区-无套内射无码| 精品一区二区三区欧美| 日本在线不卡一区二区| 国产欧美精品一区| 欧美色图亚洲天堂| 在线免费观看视频一区| 国产黄色大片网站| 亚洲人成电影在线观看天堂色| 国产一二区在线| 欧美在线视频播放| 成人影院网站ww555久久精品| 精品蜜桃一区二区三区| 天天综合国产| 国产99久久九九精品无码| 九色综合狠狠综合久久| 香港三级日本三级| 亚洲日本在线a| 亚洲欧美日韩一区二区三区四区| 日韩视频在线永久播放| 成人在线免费看| 国语自产精品视频在线看一大j8 | 久久精品亚洲无码| 欧美性高清videossexo| 欧洲成人一区二区三区| 日韩小视频网址| 一二三四视频在线中文| 99国精产品一二二线| 成人6969www免费视频| 3d动漫一区二区三区| 国产麻豆精品视频| 国产欧美小视频| 欧美视频在线观看 亚洲欧| www.久久色| 日韩在线视频观看正片免费网站| 色戒汤唯在线| www.久久草| 欧美在线播放| 91小视频在线播放| 国产欧美日韩中文久久| 天天操天天操天天操天天| 日韩精品一区二区三区蜜臀 | 久久久国产成人精品| 在线国产成人影院| 久久亚洲综合网| 欧美午夜久久| 久久精品一二三四| 中文字幕日韩精品一区| 日本丰满少妇做爰爽爽| 亚洲欧美日韩一区二区在线| zzzwww在线看片免费| 国产精品国产三级国产专区53 | 小早川怜子一区二区三区| 中文字幕第一页久久| 成人一二三四区| 亚洲欧洲午夜一线一品| 国产精品伦理| 欧美精品国产精品久久久 | 九九热这里有精品| 色噜噜色狠狠狠狠狠综合色一 | 日本xxxx黄色| 中文字幕欧美日本乱码一线二线 | 欧美午夜在线视频| 18深夜在线观看免费视频| 亚洲免费毛片网站| 国产成人a人亚洲精品无码| 欧美成人合集magnet| 欧美激情精品| 国产91在线亚洲| 成人动漫中文字幕| 久久露脸国语精品国产91| 日韩国产在线看| 欧美18—19sex性hd| 日韩精品一区二区三区丰满 | 日韩精品你懂的| 国产精品欧美一区二区三区| 国产伦理吴梦梦伦理| 欧美裸身视频免费观看| 欧美精品国产白浆久久久久| 男人操女人免费软件| 欧美激情综合网| 91片黄在线观看喷潮| 欧美丰满少妇xxxxx| 亚洲成人一品| 国产又粗又长又大的视频| 中文字幕一区二区三区不卡在线| 国产女人高潮时对白| 欧美激情精品久久久久久久变态| 亚欧日韩另类中文欧美| 国产 porn| 国产精品欧美一级免费| 国产黄色片网站| 亚洲**2019国产| 精品视频免费在线观看| 五月六月丁香婷婷| 亚洲成人一区在线| 国产福利小视频在线观看| 亚洲一区亚洲二区| 免费日韩视频| www.xxxx日本| 亚洲国内精品视频| 成人全视频免费观看在线看|