質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Q&A

解決済

1回答

470閲覧

Vuexのstateを利用して…

tampopopofu

総合スコア22

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

0グッド

0クリップ

投稿2019/03/30 08:16

編集2019/03/30 08:23

前提・実現したいこと

vue.jsの兄弟コンポーネント間でのメソッドのやり取りで悩んでいます。
簡単に言いますと、兄コンポーネントから弟コンポーネントのメソッドを呼びたいのです。

それをVuexを使って実現したいです。

状況説明

今は、兄コンポーネントから親コンポーネントに$emit、親コンポーネントから弟コンポーネントに$refs経由で実現しようとしています。

buttononclickイベントでoyaFuncを呼び出す。

vue

1// Ani.vue 2<template> 3 <div> 4 <button @click="aniClick"></button> 5 </div> 6<template> 7<script> 8export default { 9 ~(略)~ 10 methods: { 11 aniClick() { 12 this.$emit('oyaFunc'); 13 }, 14 }, 15} 16</script>

oyaFunc経由でcallOtoutoを呼び出す。

vue

1// Oya.vue 2<template> 3 <oya> 4 <ani @oyaFunc="callOtouto"></ani> 5 <otouto refs="bbb"></otouto> 6 </oya> 7<template> 8<script> 9export default { 10 ~(略)~ 11 methods: { 12 callOtouto() { 13 this.$refs.bbb.otoutoFunc(); 14 }, 15 }, 16} 17</script>

③refsのbbbを参照してOtouto.vueotoutoFuncを実施する。

vue

1// Otouto.vue 2<template> 3 <div> 4 {{ message }} 5 </div> 6<template> 7<script> 8export default { 9 data () { 10 return { 11 message: '', 12 } 13 }, 14 methods: { 15 otoutoFunc() { 16 this.message = ★★axios通信の結果★★; 17 }, 18 }, 19} 20</script>

疑問点

いろいろと調べていくと、あまり親から子のメソッドを呼ぶべきでない、$refsは使うべきでないという記述が所々ありました。
小規模なアプリでは良いが、後々辛くなる云々…。

それならばVuexのstateで管理するほうが良い、というものがありましたが、
具体的な(上記例のような場合の)例がなくて困っております。

Vuexでの考え方が分からないでいます。

教えていただきたいこと

Vuexのstatemutationsactionsgettersを作成し、stateへの何らかの値の出し入れまでは実現し、理解しているつもりです。

上記例のような場合、どのようにVuexで実現するのか教えていただきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karamarimo

2019/03/30 08:54 編集

兄弟のコンポーネントのメソッドを呼び出す必要があるケースがイメージしにくいのですが、具体的にどのようなコンポーネント、メソッドを考えているでしょうか。
tampopopofu

2019/03/30 13:25

あまり具体的に書くと説明しづらいのですが・・ 例えば、兄コンポーネントにメニューのようなボタンがあり、それを押下することで弟コンポーネントの内容を書き換えるとかです。 弟コンポーネントはcreateXXXメソッドのように、メニューの値を元に情報を取得して表示します。 再利用可能な単一コンポーネントを利用するので、所々に兄弟コンポーネントでのやり取りが必要になってきます。
guest

回答1

0

ベストアンサー

「子から親」以外でイベントを送るにはEvent Busのようなものが必要になります。Vuexはstateを一箇所で管理するためのものであり、Event Busとしては使えないと思います。

Event Busを使わないアプローチとして、今のotoutoFuncでしているHTTPリクエストの処理をotoutoでせずに、例えば以下のようにするといいと思います。

Vuexを使う場合
aniがactionを呼び出し、そのaction内でHTTPリクエストをして結果をstateに入れ、otoutoはその値を使う

Vuexを使わない場合
aniのイベントを受けてoyaがHTTPリクエストして結果を自分のdataに入れ、otoutoにpropで渡す

投稿2019/03/30 09:12

編集2019/03/30 09:15
karamarimo

総合スコア2551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tampopopofu

2019/03/30 13:47

ご回答ありがとうございます! 「Vuexを使う場合」の回答が大変参考になりました。 私の疑問でもあったVuexを使え、というのはそういうことなんでしょうね。 弟コンポーネントのメソッドを呼ぶのではなく、処理結果をstateに入れてそれを参照しろと。 もしアプリが大規模になり、それに伴うメソッドが増えるとストアが大きくなり見通しが悪くなってくると思うので、その場合はストアを分割すればいいですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問