vue 組件基礎

本篇主要是摘抄的vue的官方文檔,寫此文章的目的是加深對他們的理解。html

1.組件的一個基本實例 // 定義一個名爲 button-counter 的新組件vue

// 定義一個名爲 button-counter 的新組件
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

<div id="components-demo">
  <button-counter></button-counter>
</div>
new Vue({ el: '#components-demo' })
複製代碼

2.組件的複用 咱們能夠將上面自定義的組件進行任意次數的複用bash

<div id="components-demo">
  <button-counter></button-counter>
  <button-counter></button-counter>
  <button-counter></button-counter>
</div>
複製代碼

注意當點擊按鈕的時候,每一個組件都會各自獨立維護它的count.由於你每用一次組件,就會有一個它的新的實例被建立。函數

data必須是一個函數,由於每一個實例能夠維護一份被返回對象的獨立的拷貝。post

3.組件的組織 一般一個應用會以一棵嵌套的組件樹的形式組成。 組件的註冊方式的類型:全局註冊和局部註冊。 全局註冊ui

Vue.component('my-component-name', {
  // ... options ...
})
複製代碼

全局註冊的組件能夠用在其被註冊以後的任何 (經過 new Vue) 新建立的 Vue 根實例,也包括其組件樹中的全部子組件的模板中this

4.經過Prop向子組件傳遞數據是單向的,全部的prop都使得其父子prop之間造成了一個單向下行綁定:父級prop的更新會向下流動到子組件中,可是反過來是不行的。這樣會防止從子組件意外改變父級組件的狀態。此外,每次父組件發生更新的時候,子組件中全部的prop都會刷新爲最新值。spa

5.監聽子組件事件 子組件經過調用內建的$emit方法並傳入事件名稱來觸發一個事件,如今使用一個案例,開發組件時,它的一些功能要求和父級組件進行溝通。例如咱們可能會引入一個可訪問性的功能來放大博文的字號,同時讓頁面的其它部分保持默認的字號。code

在其父組件中,咱們能夠經過添加一個 postFontSize 數據屬性來支持這個功能:component

new Vue({
  el: '#blog-posts-events-demo',
  data: {
    posts: [/* ... */],
    postFontSize: 1
  }
})
複製代碼

它能夠在模板中用來控制全部博文的字號:

<div id="blog-posts-events-demo">
  <div :style="{ fontSize: postFontSize + 'em' }">
    <blog-post
      v-for="post in posts"
      v-bind:key="post.id"
      v-bind:post="post"
    ></blog-post>
  </div>
</div>
複製代碼

如今咱們在每篇博文正文以前添加一個按鈕來放大字號:

Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <button>
        Enlarge text
      </button>
      <div v-html="post.content"></div>
    </div>
  `
})
複製代碼

問題是這個按鈕不會作任何事:

<button>
  Enlarge text
</button>
複製代碼

當點擊這個按鈕時,咱們須要告訴父級組件放大全部博文的文本。幸虧 Vue 實例提供了一個自定義事件的系統來解決這個問題。父級組件能夠像處理 native DOM 事件同樣經過 v-on 監聽子組件實例的任意事件:

<blog-post
  ...
  v-on:enlarge-text="postFontSize += 0.1"
></blog-post>
複製代碼

同時子組件能夠經過調用內建的 $emit 方法 並傳入事件名稱來觸發一個事件:

<button v-on:click="$emit('enlarge-text')">
  Enlarge text
</button>
複製代碼

有了這個 v-on:enlarge-text="postFontSize += 0.1" 監聽器,父級組件就會接收該事件並更新 postFontSize 的值。

6.使用事件拋出一個值 有的時候用一個事件來拋出一個特定的值是很是有用的。例如咱們可能想讓 組件決定它的文本要放大多少。這時可使用 $emit 的第二個參數來提供這個值:

<button v-on:click="$emit('enlarge-text', 0.1)">
  Enlarge text
</button>
複製代碼

而後當在父級組件監聽這個事件的時候,咱們能夠經過 $event 訪問到被拋出的這個值:

<blog-post
  ...
  v-on:enlarge-text="postFontSize += $event"
></blog-post>
複製代碼

或者,若是這個事件處理函數是一個方法:

<blog-post
  ...
  v-on:enlarge-text="onEnlargeText"
></blog-post>
複製代碼

那麼這個值將會做爲第一個參數傳入這個方法:

methods: {
  onEnlargeText: function (enlargeAmount) {
    this.postFontSize += enlargeAmount
  }
}
複製代碼

7.在組件上使用v-model

v-model 實際上是個語法糖 自定義事件也能夠用於建立支持 v-model 的自定義輸入組件。記住:

<input v-model="searchText">
複製代碼

等價於:

<input
  v-bind:value="searchText"
  v-on:input="searchText = $event.target.value"
>
複製代碼

當用在組件上時,v-model 則會這樣:

<custom-input
  v-bind:value="searchText"
  v-on:input="searchText = $event"
></custom-input>
複製代碼

爲了讓它正常工做,這個組件內的

<input>
複製代碼

必須:

將其 value 特性綁定到一個名叫 value 的 prop 上 在其 input 事件被觸發時,將新的值經過自定義的 input 事件拋出 寫成代碼以後是這樣的:

Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
  `
})
複製代碼

如今 v-model 就應該能夠在這個組件上完美地工做起來了:

<custom-input v-model="searchText"></custom-input>
複製代碼

到目前爲止,關於組件自定義事件你須要瞭解的大概就這些了,若是你閱讀完本頁內容並掌握了它的內容,咱們會推薦你再回來把自定義事件讀完。

8.動態組件 不一樣組件之間的動態切換,這須要

<component>
複製代碼

元素的is特性來實現:

<!-- 組件會在 `currentTabComponent` 改變時改變 -->
<component v-bind:is="currentTabComponent"></component>

複製代碼

在上述示例中,currentTabComponent 能夠包括

  • 已註冊組件的名字,或

  • 一個組件的選項對象

相關文章
相關標籤/搜索