首頁 > web前端 > js教程 > 主體

Vue.js每天必學之組件與組件間的通信

高洛峰
發布: 2017-01-03 17:26:19
原創
1186 人瀏覽過

什麼是組件?

元件(Component)是 Vue.js 最強大的功能之一。元件可以擴充 HTML 元素,封裝可重複使用的程式碼。在較高層面上,元件是自訂元素,Vue.js 的編譯器為它添加特殊功能。在某些情況下,元件也可以是原生 HTML 元素的形式,以 is 特性擴充。

使用元件

註冊

之前說過,我們可以用Vue.extend() 創建一個組件構造器:

var MyComponent = Vue.extend({
 // 选项...
})
登入後複製

   

這個構造器用作組件,需要用`ue , constructor)` **註冊** : 

// 全局注册组件,tag 为 my-component
Vue.component('my-component', MyComponent)
登入後複製

   

對於自訂標籤名字,Vue.js 不強制要求遵循W3C 規則(小寫,並且包含一個短槓),儘管遵循這個規則比較好。

元件在註冊之後,便可以在父實例的模組中以自訂元素 的形式使用。要確保在初始化根實例之前註冊了元件:

<div id="example">
 <my-component></my-component>
</div>
 
// 定义
var MyComponent = Vue.extend({
 template: &#39;<div>A custom component!</div>&#39;
})
 
// 注册
Vue.component(&#39;my-component&#39;, MyComponent)
 
// 创建根实例
new Vue({
 el: &#39;#example&#39;
})
登入後複製

   

渲染為: 

<div id="example">
 <div>A custom component!</div>
</div>
登入後複製

   

組件的模板被替換了一個自訂元素,自訂元素的自訂元素,自訂元素的模板被替換為一個注意組件的模板被取代了一個功能。可以用實例選項 replace 決定是否要替換。

局部註冊

不需要全域註冊每個元件。可以讓元件只能用在其它元件內,用實例選項 components 註冊:

var Child = Vue.extend({ /* ... */ })
 
var Parent = Vue.extend({
 template: &#39;...&#39;,
 components: {
 // <my-component> 只能用在父组件模板内
 &#39;my-component&#39;: Child
 }
})
登入後複製

   

這種封裝也適用於其它資源,如指令、過濾器和過渡。 

註冊語法糖

為了讓事件更簡單,可以直接傳入選項物件而不是建構器給 Vue.component() 和 component 選項。 Vue.js 在背後自動呼叫Vue.extend():

// 在一个步骤中扩展与注册
Vue.component(&#39;my-component&#39;, {
 template: &#39;<div>A custom component!</div>&#39;
})
 
// 局部注册也可以这么做
var Parent = Vue.extend({
 components: {
 &#39;my-component&#39;: {
  template: &#39;<div>A custom component!</div>&#39;
 }
 }
})
登入後複製

   

元件選項問題

傳入Vue 建構器的多數選項也可以用在Vue.extend() 中,不過有兩個特例: data 和el。試想如果我們簡單地把一個物件當作 data 選項傳給 Vue.extend():

var data = { a: 1 }
var MyComponent = Vue.extend({
 data: data
})
登入後複製

   

這麼做的問題是 `MyComponent` 所有的實例將共享同一個 `data` 物件!這基本上不是我們想要的,因此我們應該使用一個函數作為`data` 選項,讓這個函數回傳一個新物件:

var MyComponent = Vue.extend({
 data: function () {
 return { a: 1 }
 }
})
登入後複製

   

同理,`el` 選項用在`Vue.extend() ` 中時也須是個函數。 

模板解析

Vue 的模板是 DOM 模板,使用瀏覽器原生的解析器而不是自己實作一個。相較於字串模板,DOM 模板有一些好處,但也有問題,它必須是有效的 HTML 片段。有些 HTML 元素對什麼元素可以放在它裡面有限制。常見的限制:
 •a 不能包含其它的互動元素(如按鈕,連結)
 •ul 和ol 只能直接包含其它的互動元素(如按鈕,連結)
 •ul 和ol 只能直接包含li
 •select 只能包含option 和optgroup
 •table 只能直接包含, tr, caption, col, colgroup
 •tr 只能直接包含th 和td 

在實際中,這些限制會導致意外的結果。儘管在簡單的情況下它可能可以工作,但是你不能依賴自訂元件在瀏覽器驗證之前的展開結果。例如 不是有效的模板,即使 my-select 元件最終展開為

另一個結果是,自訂標籤(包括自訂元素和特殊標籤,如