1. 程式人生 > >vue元件通訊

vue元件通訊

一、子元件與父元件通訊

這部分vue文件已經說的很清楚了,但是為了更好的理解,自己再整理一遍。

首先,父元件的與子元件的通訊是通過子元件的props。

那麼子元件有資料變化時,想要通知父元件應該怎麼辦呢?

父元件可以在使用子元件的地方直接用 v-on 來監聽子元件觸發的事件。

簡單來說,就是子元件監聽的事件,在函式內使用 $emit(eventName, optionalPayload) 觸發事件,在父元件使用v-on監聽emit的觸發事件

程式碼如下:

<div id="counter-event-example">//父元件
  <p>{{ total }}</p>
  <button-counter v-on:increment
="incrementTotal"></button-counter>//子元件 <button-counter v-on:increment="incrementTotal"></button-counter>//子元件 </div>

Vue.component('button-counter', {
  template: '<button v-on:click="incrementCounter">{{ counter }}</button>',
  data: function () {
    return {
      counter: 0
    }
  },
  methods: {
    incrementCounter: function () {
      this.counter += 1
      this.$emit
('increment')//觸發事件 } }, }) new Vue({ el: '#counter-event-example', data: { total: 0 }, methods: { incrementTotal: function () { this.total += 1 } } })

二、非父子元件通訊

分3步:

1.使用一個空的 Vue 例項作為事件匯流排

var parent = new Vue({ el: '#parent' })
// 訪問子元件例項
var child = parent.$refs.profile

var bus = new Vue()

2.觸發元件 A 中的事件
bus.$emit('id-selected', 1)

3.在元件 B 建立的鉤子中監聽事件
bus.$on('id-selected', function (id) {
  // ...
})

三、js操作元件

在js中直接訪問子元件,可以使用 ref 為子元件指定一個引用 ID:

<div id="parent">
  <user-profile ref="profile"></user-profile>//ref為子元件指定id
</div>
var parent = new Vue({ el: '#parent' })
// 訪問子元件例項
var child = parent.$refs.profile
當 ref 和 v-for 一起使用時,獲取到的引用會是一個數組,包含和迴圈資料來源對應的子元件

$refs 只在元件渲染完成後才填充,並且它是非響應式的。它僅僅是一個直接操作子元件的應急方案——應當避免在模板或計算屬性中使用 $refs。