VueJS: 兄弟component間で同一メソッドを伝播させたい

updated: 2020/2/5

 

vue@2.5.7

vuex@3.0.1

 

ParentComponent.vue

  <app-child-component

    v-for="1 in n"

  >

 

親componentからv-forを使って複数の子componentが存在

子componentAで発生させたdoSomething()を兄弟componentB、C、D、、、でも同様に発生させたい。この方法について。

 

i) Vuexを使ってstateで管理して子componentAでchangeした値をB、C、D、、、で共有できるか試みた。(イベントを伝播させるのではなくイベントの結果で得る値を共有)

doSomethingがvuetifyの<v-img contain>に関係するCSS関連のリサイズ処理で、

document.getElementById()を使用する必要があり、vuexで実装出来なかった。

 値だけパスすればよければVuexを使えばよく、何らかの理由でメソッド自体を伝播させたければ下記の方法で解決できる。

ⅱ) 親componentからprops、eventEmiterを設定してその値の変化で共通のdoSomethingを発生させた。

ParentComponent.vue

  <app-child-component

    v-for="1 in n"

    :eventEmitter="eventEmitter"

    v-on:callDispatcher="callDispatcher"

  >

  data() {

    return {

     eventEmitter: 0

    }

  },

  methods: {

    callDispatcher() {

      this.eventEmitter++

    }

  }

 

ChildComponent.vue

  methods: {

    callDoSomethingAndChangeProps() {

      this.$emit('callDispatcher')

      doSomethig()

    },

    doSomethig() {

      // do something

    }

  }

これで各子componentでcallDoSomethingAndChangePropsを発生させると他の子componentのprops eventEmitterが++されるようになったのでこの値の変化に応じてdoSomething()がinitされるようにすればよい。

ChildComponent.vue

  beforeUpdate() {

    doSomething()

  }

  updated() {

    doSomething()

  }

beforeUpdateもupdatedもpropsの変化があってもdoSomething()をinitしない。

solution) watchを使う

https://jp.vuejs.org/v2/api/index.html#vm-watch

ChildComponent.vue

watch: {

  'eventEmitter'() {

    this.doSomething

  }

}

これでpropsのeventEmitterの値が変化したらdoSomethingがinitされるようになった。

目的である子componentでdoSomethingがinit されたら兄弟component でもdoSomethingがinitされるようになった。

 

おまけ:

一連の動作に使うdata, methods, watch は子component間で共通なのでmixinにまとめるとよい。