別々のコンポネントの間で値を共有するためには
大きく分けるとEventBusを利用するパターンと、Pluginを利用するパターン、propsなどを使えます。それぞれ状況により役目が違います。
この場合、他のコンポネントのメソッドを使うのだと判断し、EventBusを使います。
わかりやすく出来てるページはここでした。
https://medium.com/@andrejsabrickis/https-medium-com-andrejsabrickis-create-simple-eventbus-to-communicate-between-vue-js-components-cdc11cd59860
やるべきことはこうなります。
- EventBusを宣言
- ボタンを押すページ(bar)からEventBusのemit()を利用して呼び出したいイベントの名前を設定(キーです)
- データを持って来たいページから(foo)EventBusのon()を利用し、実行したいイベントを紐づけする
jsfiddle(old) : https://jsfiddle.net/yeondev/bq0fpL8j/
jsfiddle(new) : https://jsfiddle.net/yeondev/bq0fpL8j/9/
■ 補足
上記のパターンは、AからBにデータを送ったり、トリガーを引いたりする仕組みです。
Aから変化を与えたBのデータを、Aからまた取得するにはデータをピンポンするようにやり取りする方法があります。
typescript
1// main.js
2// EventBusを宣言しましょう
3Vue.prototype.$EventBus = new Vue()
typescript
1// foo.vue
2<template>
3 <div>
4 <form @submit.prevent="testFoo">
5 <input type="submit" value="fooButton"> => {{ msg }}
6 </form>
7 </div>
8</template>
9
10<script>
11
12export default {
13 data () {
14 return {
15 msg: 'default fooですよ'
16 }
17 },
18 methods: {
19 testFoo: function () {
20 console.log('順番3.Foo::testFoo() 開始')
21 console.log('順番3-1.Foo::testFoo() 変化する前のメッセージ=> ', this.msg)
22 this.msg = 'updated fooですよ'
23 console.log('順番3-2.Foo::testFoo() 変化する後のメッセージ=> ', this.msg)
24 console.log('順番3-3.Foo::testFoo() リターンせずMsgだけ変換したまま終了')
25 }
26 },
27 created () {
28 this.$EventBus.$on('callTestFoo', () => {
29 console.log('順番2.Foo::EventBus:EventBus始動、Fooから何かの処理を行う(この場合testFoo)')
30 this.testFoo() // msgに何か変化を与えたい場合に使う関数
31 console.log('順番4.Foo::EventBus:msgをパラメータとしてBarの関数を呼び出す')
32 this.$EventBus.$emit('callTestBar', this.msg) // barにmsgを送る
33 })
34 }
35}
36</script>
37
38
Typescript
1//bar.vue
2<template>
3 <div>
4 <foo></foo>
5 <form @submit.prevent="testBar">
6 <input type="submit" value="barButton"> => {{ barMsg }}
7 </form>
8 </div>
9</template>
10
11<script>
12import bar from '@/components/bar'
13import foo from '@/components/foo'
14
15export default {
16 data () {
17 return {
18 barMsg: 'default barですよ'
19 }
20 },
21 components: {
22 foo,
23 bar
24 },
25 methods: {
26 getValueFromFoo: function (value) {
27 console.log('順番6.Bar::getValueFrom:パラメータを受け取る')
28 this.barMsg = value
29 },
30 testBar: function () {
31 console.log('順番1.Bar::testBar:パラメータなしでFooの関数を呼び出す')
32 this.$EventBus.$emit('callTestFoo')
33 // fooB.methods.testFoo()
34 }
35 },
36 created () {
37 this.$EventBus.$on('callTestBar', (parameterFromFoo) => {
38 console.log('順番5.Bar::EventBus:EventBus始動、getValueFromFoo関数を呼び出す。書かれてないがFooから貰ったパラメータが入ってる(getValueFromFoo(msg)みたいに)')
39 this.getValueFromFoo(parameterFromFoo)
40 }) // fooからmsgを貰い、getValueFromFooにパラメータとして渡す
41 }
42}
43</script>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/16 10:05 編集
2018/10/16 10:25
2018/10/17 02:33