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

Vue.js的注意事項與技巧

開發 前端
Vue.js 是一個很棒的框架。然而,當你開始構建一個大型 JavaScript 項目的時候,你將對 Vue.js 感到一些困惑。這些困惑并不是來自框架本身,相反 Vue.js 團隊會經常調整一些重要設計策略。

 [[261192]]

Vue.js 是一個很棒的框架。然而,當你開始構建一個大型 JavaScript 項目的時候,你將對 Vue.js 感到一些困惑。這些困惑并不是來自框架本身,相反 Vue.js 團隊會經常調整一些重要設計策略。

相對于 React 和 Angular,Vue.js 面向一些不同水平的開發者。它更加的友好,不管是對初學者還是經驗豐富的老手。它并不隱藏一些 DOM 操作,相反它與 DOM 配合的很好。

這篇文章更像是一個目錄,列舉了我在 Vue.js 的初學路上遇到一些問題和技巧。理解這些關鍵性的設計技巧,有助于我們構建大型的 Web 應用。

寫這篇文章的時候是 2018 年 5 月 18 日,下面這些技巧依然是有效的。但是框架升級,或者瀏覽器底層或者 JS API 發生改變時,他們可能會變得不是那么有用。

譯者注:盡管 Vue.js 3 即將到來,但是下面的技巧大部分是有用的,因為 3 的版本并不會改變一些上層 API ,***的特性可能是底層數據 Observer 改有 proxy 實現,以及源碼使用 typescript 構建。

1、為什么 Vue.js 不使用 ES Classes 的方式編寫組件

如果你使用過類似于 Angular 的框架或者某些后端 OOP 語言后,那么你的***個問題可能是:為什么不使用 Class 形式的組件?

Vue.js 的作者在 GitHub issues 中很好的回答了這個問題:

Use standard JS classes instead of custom syntax?

為什么不使用 Class 這里有三個很重要的原因:

ES Classes 不能夠滿足當前 Vue.js 的需求,ES Classes 標準還沒有完全規范化,并且總是朝著錯誤的方向發展。如果 Classes 的私有屬性和裝飾器(當前已進入 Stage 3)穩定后,可能會有一定幫助。

ES Classes 只適合于那些熟悉面向對象語言的人,它對哪些不使用復雜構建工具和編譯器的人不夠友好。

優秀的 UI 組件層次結構一般都是組件的橫向組合,它并不是基于繼承的層次結構。而 Classes 形式顯然更擅長的是后者。

譯者注:But,Vue.js 3.0 將支持基于 Class 的組件寫法,真香。

2、如何構建自己的抽象組件?

如果你想構建自己的抽象組件(比如 transition、keep-alive),這是一個比構建大型 web 應用更加瘋狂地想法,這里有一些關于這個問題的討論,但是并沒有什么進展。

Any plan for docs of abstract components?

譯者注:在 Vue.js 內部組件(transition、keep-alive)中,使用了一個 abstract 屬性,用于聲明抽象組件,這個屬性作者并不打算開放給大家使用,所以文檔也沒有提及。但是如果你要使用也是可以的,那么你必須深入源碼探索該屬性有何作用。

但是不要害怕,如果你可以很好地理解 slots ,你就可以構建自己的抽象組件了。這里有一篇很好的博客介紹了要如何做到這一點。

Writing Abstract Components with Vue.js

譯者注:下面是《在 Vue.js 中構建抽象組件》的簡單翻譯

抽象組件與普通組件一樣,只是它不會在界面上顯示任何 DOM 元素。它們只是為現有組件添加額外的行為。

就像很多你已經熟悉的 Vue.js 的內置組件,比如:` `、``、``。

現在展示一個案例,如何跟蹤一個 DOM 已經進入了可視區域 ,讓我們使用 IntersectionObserver API 來實現一個解決這個問題的抽象組件。

(完整代碼在這里:[vue-intersect](https://github.com/heavyy/vue-intersect))

  1. // IntersectionObserver.vue 
  2. export default { 
  3.   // 在 Vue 中啟用抽象組件 
  4.   // 此屬性不在官方文檔中, 可能隨時發生更改,但是我們的組件必須使用它 
  5.   abstract: true
  6.   // 重新實現一個 render 函數 
  7.   render() { 
  8.     // 我們不需要任何包裹的元素,只需要返回子組件即可 
  9.     try { 
  10.       return this.$slots.default[0]; 
  11.     } catch (e) { 
  12.       throw new Error('IntersectionObserver.vue can only render one, and exactly one child component.'); 
  13.     } 
  14.  
  15.     return null
  16.   }, 
  17.   mounted () { 
  18.     // 創建一個 IntersectionObserver 實例 
  19.     this.observer = new IntersectionObserver((entries) => { 
  20.       this.$emit(entries[0].isIntersecting ? 'intersect-enter' : 'intersect-leave', [entries[0]]); 
  21.     }); 
  22.  
  23.     // 需要等待下一個事件隊列,保證子元素已經渲染 
  24.     this.$nextTick(() => { 
  25.       this.observer.observe(this.$slots.default[0].elm); 
  26.     }); 
  27.   }, 
  28.   destroyed() { 
  29.     // 確保組件移除時,IntersectionObserver 實例也會停止監聽 
  30.     this.observer.disconnect(); 
  31.   } 
  32.  

讓我們看看如何使用它?

  1. <intersection-observer @intersect-enter="handleEnter" @intersect-leave="handleLeave"
  2.   <my-honest-to-goodness-component></my-honest-to-goodness-component> 
  3. </intersection-observer> 

 

但是在這樣做之前,請你三思。我們一般依賴 mixins 和一些純函數來解決一些特殊場景的問題,你可以將 mixins 直接看做一個抽象組件。

How do I extend another VueJS component in a single-file component? (ES6 vue-loader)

3、我不太喜歡 Vue.js 的單文件組件,我更希望 HTML、CSS 和 JavaScript 分離。

沒有人阻止你這樣做,如果你是個注重分離的哲學家,喜歡把不同的東西放在不同文件,或者討厭編輯器對 .vue 文件的不穩定行為,那么你這么做也是可以的。你要做的很簡單:

  1. <!--https://vuejs.org/v2/guide/single-file-components.html --> 
  2. <!-- my-component.vue --> 
  3. <template src="./my-component.html"></template> 
  4. <script src="./my-component.js"></script> 
  5. <style src="./my-component.css"></style>  

這么做,就會出現下一個問題:我的組件總是需要 4 個文件(vue + html + css + js)嗎?我能不能擺脫 .vue 文件? 答案是肯定的,你可以使用 vue-template-loader。

我的同事還為此寫了一篇很棒的教程:

Using vue-template-loader with Vue.js to Compile HTML Templates

4、 函數式組件

感謝 React.js 讓函數式組件很流行,這是因為他們無狀態、易于測試。然而它們也存在一些問題。

譯者注:不了解 Vue.js 函數式組件的可以先在官方文檔查看:官方文檔

4.1 為什么我不能對功能組件使用基于 Class 的 @Component 裝飾器?

再次回到 Classes,它只是一種用于保存本地狀態的數據結構。如果函數式組件是無狀態的,那么使用 @Component 裝飾器就是無意義的。

這里有關于這個的討論:

How to create functional component in @Component?

4.2 外部類和樣式不應用于函數式組件

函數式組件不能像普通組件那樣,綁定具體的類和樣式,必須在 render 函數中手動應用這些綁定。

DOM class attribute not rendered properly with functional components

class attribute ignored on functional components

4.3 函數式組件總是會重復渲染?

TLDR:在函數式組件中使用有狀態組件時務必要小心

Functional components are re-rendered when props are unchanged.

函數式組件相當于直接調用組件的 Render 函數,這意味著你應該:

避免在 render 函數中直接使用有狀態組件,因為這會在每次調用 render 函數時創建不同的組件實例。

如果函數式組件是葉子組件,會更好地利用它們。 需要注意的是,同樣的行為也適用于 React.js。

4.4 如何在Vue.js 函數式組件中觸發一個事件?

在從函數式組件中觸發一個事件并不簡單。不幸的是,文檔中也沒有提到這一點。函數式組件中不可用 $emit 方法。stack overflow 上有人討論過這個問題:

How to emit an event from Vue.js Functional component?

5、Vue.js 的透明包裹組件

組件包裹一些DOM元素,并且公開了這些DOM元素的事件,而不是根DOM的節點實例。

例如:

  1. <!-- Wrapper component for input --> 
  2. <template> 
  3.     <div class="wrapper-comp"
  4.         <label>My Label</label> 
  5.         <input @focus="$emit('focus')" type="text"/> 
  6.     </div> 
  7. </template> 

這里我們真正感興趣的是 input 節點,而不是 div 根節點,因為它主要是為了樣式和修飾而添加的。用戶可能對這個組件的幾個輸入事件感興趣,比如 blur、focus、click、hover等等。這意味著我們必須重新綁定每個事件。我們的組件如下所示。

  1. <!-- Wrapper component for input --> 
  2. <template> 
  3.     <div class="wrapper-comp"
  4.         <label>My Label</label> 
  5.         <input type="text" 
  6.             @focus="$emit('focus')" 
  7.             @click="$emit('click')" 
  8.             @blur="$emit('blur')" 
  9.             @hover="$emit('hover')" 
  10.         /> 
  11.     </div> 
  12. </template> 

實際上這是完全沒必要的。簡單的解決方案是使用 Vue 實例上的屬性 vm.$listeners 將事件重新綁定到所需DOM 元素上:

  1. <!-- Notice the use of $listeners --> 
  2. <template> 
  3.     <div class="wrapper-comp"
  4.         <label>My Label</label> 
  5.         <input v-on="$listeners" type="text"/> 
  6.     </div> 
  7. </template> 
  8. <!-- Uses: @focus event will bind to internal input element --> 
  9. <custom-input @focus="onFocus"></custom-input> 

6、為什么你不能在 slot 上綁定和觸發事件

我經常看到有些開發人員,在 slot 上進行事件的監聽和分發,這是不可能的。

組件的 slot 由調用它的父組件提供,這意味著所有事件都應該與父組件相關聯。嘗試去傾聽這些變化意味著你的父子組件是緊密耦合的,不過有另一種方法可以做到這一點,Evan You解釋得很好:

Is it possible to emit event from component inside slot #4332

Suggestion: v-on on slots

7、slot 中的 slot(訪問孫輩slot)

在某些時候,可能會遇到這種情況。假設有一個組件,比如 A ,它接受一些 slot 。遵循組合的原則,使用組件 A 構建另一個組件 B 。然后你把 B 用在 C 中。

那么現在問題來了: 如何將 slot 從 C 組件傳遞到 A 組件?

要回答這個問題,首先取決你使用何種方式構建組件? 如果你是用 render 函數,那就很簡單。你只需要在組件 B 的 render 函數中進行如下操作: 

  1. // Render function for component B 
  2. function render(h) { 
  3.     return h('component-a', { 
  4.         // Passing slots as they are to component A 
  5.         scopedSlot: this.$scopedSlots 
  6.     } 
  7.  

但是,如果你使用的是基于模板的方式,那么就有些糟糕了。幸運的是,在這個問題上有了進展:

feat(core): support passing down scopedSlots with v-bind 

希望這篇文章讓你對 Vue.js 的設計思路有了更深入的了解,并為你提供了一些在高級場景中的技巧。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2011-06-24 09:23:02

SEO

2010-05-11 11:03:41

Mysql索引

2011-05-26 11:22:04

SEO

2010-06-21 14:39:56

光纖測試

2013-09-25 10:15:51

閃存存儲優勢注意事項

2009-08-27 10:40:56

Java路徑

2010-06-10 13:11:23

2013-03-14 14:07:55

活動目錄域名控制器服務器虛擬化

2010-05-31 09:58:48

MySQL備份

2009-12-15 17:47:17

VSIP

2010-05-25 16:46:00

2021-11-16 10:35:59

云計算云計算環境云應用

2020-10-20 14:05:48

用戶需求分析IT

2010-11-26 16:27:01

MySQL使用變量

2023-01-14 09:49:11

2011-09-26 11:02:10

2022-04-04 16:53:56

Vue.js設計框架

2011-07-12 20:43:16

傳真機維修技巧

2011-05-06 16:22:54

佳能MP198加墨注意事項噴墨打印機

2009-12-29 11:03:28

ADO代碼
點贊
收藏

51CTO技術棧公眾號

九九久久精品| 自拍视频在线| 激情91久久| 精品久久国产97色综合| 99在线精品免费视频| 深爱五月激情五月| 久久福利影视| 亚洲精品中文字幕有码专区| 欧美大尺度做爰床戏| 黄在线免费看| 99久久国产免费看| 国产精品久久久久av| 希岛爱理中文字幕| 日韩av不卡一区| 欧美日韩中字一区| av网站手机在线观看| 成人a免费视频| 91极品视频在线观看| 麻豆tv免费在线观看| 成人在线一区二区三区| 欧美怡红院视频一区二区三区| 五月天婷婷丁香网| 狠狠一区二区三区| 欧美美女直播网站| 国产成人精品视频免费看| 欧美性天天影视| 99精品偷自拍| 亚洲综合日韩在线| 无码人妻黑人中文字幕| 欧美三级在线| 中文字幕亚洲天堂| 国产女人18毛片水真多18| 91国拍精品国产粉嫩亚洲一区 | 亚洲午夜私人影院| 香蕉久久免费影视| 狠狠躁夜夜躁av无码中文幕| 美女爽到高潮91| 69影院欧美专区视频| 亚洲大胆人体视频| 黄色a级片免费| 欧美另类tv| 国产精品午夜春色av| 久久99精品久久久久久水蜜桃| 97成人在线观看| 久久精品盗摄| 亚洲97在线观看| 欧美精品一区二区蜜桃| 久久影院一区| 夜夜嗨av一区二区三区四区| 国产精品第七页| 国产精品玖玖玖在线资源| 欧美精品日韩一区| 在线观看免费污视频| 精品国产第一福利网站| 精品久久久免费| 精品无码av无码免费专区| 免费黄网在线观看| 中文字幕中文在线不卡住| 日韩在线第一区| 九九在线视频| 91在线精品一区二区| 国产欧美日韩在线播放| 亚洲精品国产精| 国产91精品久久久久久久网曝门| 国产欧美最新羞羞视频在线观看| 最近中文字幕免费观看| 日本不卡一区二区三区| 国产精品av网站| 亚洲无码精品一区二区三区| 日韩av中文字幕一区二区三区| 日韩av免费网站| 日韩熟女一区二区| 日本欧美加勒比视频| 日韩欧美一区二区三区| 亚洲日本成人网| 国产吃瓜黑料一区二区| 国产suv精品一区| 亚洲激情第一页| 网站免费在线观看| 国产精品视频一区二区三区四蜜臂| 亚洲精品中文字幕av| 久久久视频6r| 欧美激情电影| 久久99久久亚洲国产| 精品视频一区二区在线观看| 亚洲精品裸体| 国产成人激情小视频| 中文字幕人妻色偷偷久久| 久久99国产精品成人| 91av免费看| 三级网站在线看| 久久久99久久精品欧美| 亚洲天堂电影网| 一二三四区在线观看| 亚洲国产成人高清精品| 日韩视频在线免费看| 日韩专区视频| 亚洲成人av中文字幕| 亚洲av无码一区二区三区人 | 日韩女优av电影在线观看| 国产原创剧情av| 国产亚洲欧美日韩在线观看一区二区 | 日韩成人在线视频网站| 成年人免费观看视频网站 | 日本xxxxx18| 成人黄色动漫| 欧美色手机在线观看| 久久久国产精品久久久| 免费成人网www| 久久九九全国免费精品观看| 国产午夜视频在线播放| 日韩国产精品久久| 国产精品嫩草在线观看| 中文字幕在线免费| 亚洲va韩国va欧美va精品| 国产在线a不卡| av在线播放亚洲| 中文在线8资源库| 欧美日本高清视频在线观看| 男女性杂交内射妇女bbwxz| 精品一区av| 久久久综合av| 一级特黄特色的免费大片视频| 成人的网站免费观看| 中文字幕一区二区三区有限公司| 超免费在线视频| 欧美日韩黄色影视| 中国黄色a级片| 欧美久久成人| 国产欧美日韩视频| 精品亚洲成a人片在线观看| 一级特黄大欧美久久久| 污污网站免费观看| 伊人久久大香线蕉| 久久久久免费视频| 国产三级第一页| 日本一区二区三区四区在线视频| 亚洲国产精品无码观看久久| а天堂中文最新一区二区三区| 亚洲欧美在线播放| 国产精品第56页| 国产毛片精品视频| 伊人婷婷久久| 亚洲天堂一区二区| 日韩精品999| 日本熟妇色xxxxx日本免费看| 精品一区二区三区视频| 色播亚洲视频在线观看| 免费看av不卡| 日韩精品一二三四区| 在线看成人av| 白白色亚洲国产精品| 99热久久这里只有精品| 日韩成人在线观看视频| 午夜亚洲影视| 欧美成人午夜激情| 91精品国产乱码久久| 国产日产欧美精品一区二区三区| 久章草在线视频| 啄木系列成人av电影| 欧洲精品在线视频| 欧美精品少妇| 色94色欧美sute亚洲线路二| 李宗瑞91在线正在播放| 久久精品人人做人人爽电影蜜月| 欧美高清性xxxxhd| 中文字幕在线看片| 亚洲欧洲高清在线| 波多野结衣绝顶大高潮| 中文字幕电影一区| av中文字幕网址| 影视一区二区| 99porn视频在线| 超级碰碰不卡在线视频| 日韩国产精品视频| 天堂网一区二区| 国产精品久久一卡二卡| 想看黄色一级片| 欧美日韩三区| 精品视频在线观看| 日韩成人影音| 日韩视频亚洲视频| 国产极品久久久| 亚洲一区二区视频在线观看| 丝袜熟女一区二区三区| 久久av一区二区三区| 色综合影院在线观看| 国产精品美女久久久久人| 欧美激情精品久久久久久免费印度| 欧洲成人一区二区三区| 91久久精品一区二区三| 日本不卡一二区| 福利电影一区二区| 久久久久久久久久久免费视频| 日韩伦理一区| 国产精品成人观看视频免费| 国产精品av一区二区三区 | 黄色一区二区三区| 国产精品天天干| 国产精品自在在线| 日韩av资源在线| av网在线播放| 免费欧美日韩国产三级电影| 六月婷婷激情网| 久久亚州av| 91精品久久久久久| 高清在线视频不卡| 亚洲视频在线观看网站| www.午夜激情| 91成人免费电影| 麻豆亚洲av成人无码久久精品| 91免费小视频| 91小视频在线播放| 久久亚洲风情| 隔壁人妻偷人bd中字| 日韩欧美视频在线播放| 国产99视频精品免费视频36| yw.尤物在线精品视频| 欧美劲爆第一页| 欧美jizzhd欧美| 亚洲精品国偷自产在线99热| 国产女人高潮的av毛片| 色婷婷综合久久久中文一区二区| 久久黄色小视频| 国产精品久久久久久亚洲伦 | 在线无限看免费粉色视频| 日本福利一区| 99蜜桃在线观看免费视频网站| 巨胸喷奶水www久久久| 51色欧美片视频在线观看| av片在线观看免费| 少妇激情综合网| 蝌蚪视频在线播放| 亚洲精品久久久久久下一站| 精品人妻一区二区三区麻豆91 | 99久久999| 国产精品视频久久| 激情都市亚洲| 欧美中文字幕第一页| 丁香花在线观看完整版电影| 久久精品中文字幕电影| 免费在线看a| 伊人激情综合网| 国产成人天天5g影院在线观看| 亚洲精品一区在线观看香蕉| 色综合免费视频| 精品国产乱码久久久久久闺蜜| 国产v在线观看| 欧美欧美午夜aⅴ在线观看| 亚洲网站在线看| 国产又粗又猛又爽又黄的视频一| 色哟哟国产精品| 日韩精品在线免费视频| 红桃视频成人在线观看| 国产无遮挡aaa片爽爽| 夜夜嗨av一区二区三区网页| 中文字幕影音先锋| 一区二区三区中文在线| 欧美日韩在线视频免费| 亚洲黄色av一区| 免费一级肉体全黄毛片| 夜夜精品视频一区二区| 久久精品国产亚洲av麻豆色欲| 亚洲一区二区三区中文字幕| 久久久久久久久艹| 亚洲成人综合视频| 在线观看中文字幕视频| 欧美午夜激情在线| 日韩久久久久久久久久| 欧美日韩精品一区二区三区四区| 91超薄丝袜肉丝一区二区| 欧美久久久一区| 国产黄色片免费观看| 亚洲国产精品成人av| 亚洲三级黄色片| 亚洲人成自拍网站| 五月婷婷在线视频| 美女福利视频一区| 国产精品yjizz视频网| 欧美一区第一页| 91p九色成人| 2020国产精品久久精品不卡| av在线亚洲色图| 九九九九精品九九九九| 欧美综合另类| 久久综合亚洲精品| 母乳一区在线观看| 中文av字幕在线观看| 成人免费三级在线| www.狠狠爱| 亚洲欧洲中文日韩久久av乱码| 久久精品国产亚洲AV无码男同| 欧美性videos高清精品| 91精东传媒理伦片在线观看| 亚洲福利视频在线| 不卡在线视频| 欧美日韩xxx| 性欧美gay| 91福利视频导航| 最新国产精品视频| 日韩第一页在线观看| 亚洲精品影视| 色综合色综合色综合色综合| 成人网在线免费视频| 少妇一级黄色片| 久久婷婷亚洲| 夜夜嗨av一区二区三区免费区| 久草在线免费福利资源| 久久综合伊人77777蜜臀| 麻豆免费版在线观看| 国产精自产拍久久久久久蜜| 国产厕拍一区| 在线亚洲美日韩| 羞羞视频在线观看欧美| 18深夜在线观看免费视频| 国产香蕉久久精品综合网| 久久久久人妻一区精品色欧美| 欧美性感一类影片在线播放| 蜜臀av午夜精品| 久久久精品免费| 日韩精品99| 国产一区二区三区免费不卡| 99re66热这里只有精品8| 欧美女人性生活视频| 国产成人免费高清| 999精品在线视频| 色综合久久久网| 国产成人三级在线观看视频| 永久免费看mv网站入口亚洲| 日韩激情电影免费看| 国产98在线|日韩| 亚洲精品国产首次亮相| 午夜激情av在线| 久久久久久97三级| 久久露脸国语精品国产91| 日韩欧美在线1卡| 免费高清在线观看| 国产九九精品视频| 欧美日韩一二三四| 黄色av免费在线播放| 91亚洲国产成人精品一区二区三| 精品国产乱码久久久久久鸭王1| 欧美视频中文字幕| 国产免费av高清在线| 欧美孕妇毛茸茸xxxx| 欧美五码在线| 黄网站欧美内射| 成人av网站在线| 国产精品第一页在线观看| 日韩欧美一级在线播放| 三级福利片在线观看| 91最新在线免费观看| 91高清一区| 国内av一区二区| 专区另类欧美日韩| 国产视频一区二区三区四区五区| 久久久成人精品| 成人乱码手机视频| 国产欧美123| 成人在线视频一区二区| 国产一级片免费看| 亚洲成人av在线| 伊人久久在线| 日本一区二区三区免费观看| 日本欧美久久久久免费播放网| 国产精品情侣呻吟对白视频| 欧美色网站导航| 福利视频在线| 99在线热播| 国产日韩欧美一区二区三区在线观看 | 中文字幕免费视频| 欧美日韩一区二区三区免费看| 亚洲搞黄视频| 91传媒免费看| 日韩一级在线| 亚洲天堂久久新| 欧美色图天堂网| 在线观看电影av| 777色狠狠一区二区三区| 亚洲AV无码片久久精品| 一本一本大道香蕉久在线精品| 户外极限露出调教在线视频| 国产精品偷伦免费视频观看的| 亚洲五月综合| 国产精品九九视频| 在线免费不卡视频| 国产一二区在线| 国产综合av一区二区三区| 久久一区欧美| 婷婷久久综合网| 亚洲福利精品在线| 全球最大av网站久久| 伊人久久在线观看| 久久久久久免费网| 中文字幕一区二区三区人妻四季| 欧美成人激情视频| 中文字幕精品影院| 国产伦精品一区二区三区妓女下载| 精品久久久久国产| 精品美女在线观看视频在线观看|