1. 程式人生 > >vue 元件與通訊與vuex與computed與生命週期(1)

vue 元件與通訊與vuex與computed與生命週期(1)

一:元件

1:先看官方文件

什麼是元件
元件 (Component) 是 Vue.js 最強大的功能之一。元件可以擴充套件 HTML 元素,封裝可重用的程式碼。在較高層面上,元件是自定義元素,Vue.js 的編譯器為它新增特殊功能。在有些情況下,元件也可以表現為用 is 特性進行了擴充套件的原生 HTML 元素。
所有的 Vue 元件同時也都是 Vue 的例項,所以可接受相同的選項物件 (除了一些根級特有的選項) 並提供相同的生命週期鉤子。

2:元件形式

這裡主要說vue-cli中的元件
分兩種,全域性元件和區域性元件
全域性元件註冊在main.js
區域性元件註冊在vue例項裡面,用components呼叫

3:元件傳遞

元件例項中作用域是孤立的,所以需要資料傳遞

(1)父傳子

props
父元件中

<child message="hello"></child>

子元件

props:['message']

注:html特性不區分大小寫,props中大小寫須在父元件中轉換為kebab-case
動態prop
父元件

<child :my-message="hello"></child>

文件:
如果你想把一個物件的所有屬性作為 prop 進行傳遞,可以使用不帶任何引數的 v-bind (即用 v-bind 而不是 v-bind:prop-name)。例如,已知一個 todo 物件:

todo: {
  text: 'Learn Vue',
  isComplete: false
}

然後:

<todo-item v-bind="todo"></todo-item>

將等價於:

<todo-item
  v-bind:text="todo.text"
  v-bind:is-complete="todo.isComplete"
></todo-item>

單向資料流
prop是單向繫結
父元件更新,子元件更新,不能在子元件更新
但是可以用子元件中定義區域性變數data或者computed來處理props
props驗證
文件

 props: {
    // 基礎型別檢測 (`null` 指允許任何型別)
    propA: Number,
    // 可能是多種型別
    propB: [String, Number],
    // 必傳且是字串
    propC: {
      type: String,
      required: true
    },
    // 數值且有預設值
    propD: {
      type: Number,
      default: 100
    },
    // 陣列/物件的預設值應當由一個工廠函式返回
    propE: {
      type: Object,
      default: function () {
        return { message: 'hello' }
      }
    },
// 自定義驗證函式
   propF: {
      validator: function (value) {
        return value > 10
      }
    }
  }

(2)子傳父

使用vue的自定義事件
vue例項都具有事件藉口
$on(eventName)監聽事件
$emit(eventName) 觸發事件
父元件

  <button-counter v-on:increment="incrementTotal"></button-counter>
 incrementTotal: function () {
      this.total += 1
    }

子元件

<button v-on:click="incrementCounter">{{ counter }}</button>
methods: {
    incrementCounter: function () {
      this.counter += 1
      this.$emit('increment')
    }
  },

(3) 非父子元件通訊

使用一個空的vue例項

  var bus = new Vue();
  bus.$emit('id-selected',1);
  bus.$on('id-selected',function(id){

  })

(4)卡槽slot

官方文件:除非子元件模板包含至少一個 插口,否則父元件的內容將會被丟棄。當子元件模板只有一個沒有屬性的插槽時,父元件傳入的整個內容片段將插入到插槽所在的 DOM 位置,並替換掉插槽標籤本身。
最初在 標籤中的任何內容都被視為備用內容。備用內容在子元件的作用域內編譯,並且只有在宿主元素為空,且沒有要插入的內容時才顯示備用內容。
例:
my-Component 元件

<div>
  <h2>我是子元件的標題</h2>
  <slot>
    只有在沒有要分發的內容時才會顯示。
  </slot>
</div>

父元件

<div>
  <h1>我是父元件的標題</h1>
  <my-component>
    <p>這是一些初始內容</p>
    <p>這是更多的初始內容</p>
  </my-component>
</div>

渲染結果:

<div>
  <h1>我是父元件的標題</h1>
  <div>
    <h2>我是子元件的標題</h2>
    <p>這是一些初始內容</p>
    <p>這是更多的初始內容</p>
  </div>
</div>

(5)具名插槽

slot 可以用一個name配置
例子
app-layout元件

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

父元件模板:

<app-layout>
  <h1 slot="header">這裡可能是一個頁面標題</h1>

  <p>主要內容的一個段落。</p>
  <p>另一個主要段落。</p>

  <p slot="footer">這裡有一些聯絡資訊</p>
</app-layout>

渲染結果為:

<div class="container">
  <header>
    <h1>這裡可能是一個頁面標題</h1>
  </header>
  <main>
    <p>主要內容的一個段落。</p>
    <p>另一個主要段落。</p>
  </main>
  <footer>
    <p>這裡有一些聯絡資訊</p>
  </footer>
</div>