因為組件是可復用的 Vue 實例,所以它們與 new Vue 接收相同的選項,例如 data、computed、watch、methods 以及生命周期鈎子等。僅有的例外是像 el 這樣根實例特有的選項。
組件基礎:
全局組件:可以在任何(根)實例中使用的組件;
局部組件:只能在某一實例中使用的組件:
一、定義全局組件和局部組件的兩種方法:
方法一:定義一個全局組件和局部組件
全局組件:
局部組件:
方法二:定義一個全局組件和局部組件
全局組件:
局部組件:
方法三、使用template定義
方法四、使用script定義
方法五:在模塊系統中局部注冊
你使用了諸如 Babel 和 webpack 的模塊系統。在這些情況下,我們推薦創建一個 components 目錄,並將每個組件放置在其各自的文件中。
然后你需要在局部注冊之前導入每個你想使用的組件。例如,在一個假設的 ComponentB.js 或 ComponentB.vue 文件中:
現在 ComponentA 和 ComponentC 都可以在 ComponentB 的模板中使用了。
二、父子組件:
三、父子組件通信:從父到子,用props屬性綁定
五、平行組件傳遞數據:用空實例搭建橋梁
六、prop:
1、在 JavaScript 中對象和數組是通過引用傳入的,所以對於一個數組或對象類型的 prop 來說,在子組件中改變這個對象或數組本身將會影響到父組件的狀態。
2、prop 會在一個組件實例創建之前進行驗證,所以實例的屬性 (如 data、computed 等) 在 default 或 validator 函數中是不可用的。
七、is:
解析 DOM 模板時的注意事項
有些 HTML 元素,諸如 <ul>、<ol>、<table> 和 <select>,對於哪些元素可以出現在其內部是有嚴格限制的。而有些元素,諸如 <li>、<tr> 和 <option>,只能出現在其它某些特定的元素內部。
這會導致我們使用這些有約束條件的元素時遇到一些問題。例如:
這個自定義組件 <blog-post-row> 會被作為無效的內容提升到外部,並導致最終渲染結果出錯。幸好這個特殊的 is 特性給了我們一個變通的辦法:
再比如:
八、動態組件:使用:is在不同組件之間進行動態切換:
讓多個組件使用同一個掛載點,並動態切換,這就是動態組件。通過 Vue 的 <component> 元素加一個特殊的 is 特性來實現。
示例:
也可以直接綁定到組件對象上:
九、在動態組件上使用 keep-alive:
重新創建動態組件的行為通常是非常有用的,但是在有些應用中,我們更希望那些標簽的組件實例能夠被在它們第一次被創建的時候緩存下來。為了解決這個問題,我們可以用一個 <keep-alive> 元素將其動態組件包裹起來。
條件判斷:
如果有多個條件性的子元素,<keep-alive> 要求同時只有一個子元素被渲染。
十、異步組件:
vue開發過程中,我們會做出特別多特別多的組件,包括login,header,footer,main等等。
這樣使整個網站看起來就十分的龐大,當我們在打開網頁的時候,突然一下子把這些所有的組件加載上來,這么多的請求全部同時開始請求,勢必會造成網頁打開很慢,使客戶得到的是非常差勁的體驗。
因此,vue為我們專門設立了異步組件,通過異步組件,我們可以得到兩點好處:
1、用不到的組件不會加載,因此網頁打開速度會很快,當你用到這個組件的時候,才會通過異步請求進行加載;
2、緩存組件,通過異步加載的組件會緩存起來,當你下一次再用到這個組件時,絲毫不會有任何的疑遲,組件很快會從緩存中加載出來。
為了簡化,Vue 允許你以一個工廠函數的方式定義你的組件,這個工廠函數會異步解析你的組件定義。Vue 只有在這個組件需要被渲染的時候才會觸發該工廠函數,且會把結果緩存起來供未來重渲染。例如:
如你所見,這個工廠函數會收到一個 resolve 回調,這個回調函數會在你從服務器得到組件定義的時候被調用。你也可以調用 reject(reason) 來表示加載失敗。這里的 setTimeout 是為了演示用的,如何獲取組件取決於你自己。
一個推薦的做法是將異步組件和 webpack 的 code-splitting 功能一起配合使用:
實例1:
假如你寫一個test.vue文件,在<script>標簽里,實際使用方法如下:
更簡單的異步組件的使用方法:
可以用到異步組件的地方:
1、組件中,組件中需要子組件的位置,我們就可以使用異步組件形式;
2、路由中,一般我們打開一個頁面時,其總是會進入其中一個默認的路由,那么其他路由在用不到的時候就沒必要繼續加載,當跳轉到當前路由的時候,再來加載,這里也是使用異步組件非常恰當的地方。
十一、在組件上使用 v-model:
這里的 searchText 的值將會傳入這個名為 value的 prop。同時當 <custom-input> 觸發一個 input 事件並附帶一個新的值的時候,這個 searchText 的屬性將會被更新。
