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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2418閲覧

Vue.jsのデータ渡しについて (子->親->子)

SystemRyota

総合スコア24

Vue.js

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/01/23 06:15

現在Laravelを使用してWebアプリケーションを開発しています。
Vueを使用するのが初めてで標題の事が出来ず困っています。


親: index

子: 年選択
子: テーブル


といった構成にしており、
年選択コンポーネントにてaxiosを用いてapiを叩き、テーブルに表示するデータを取得しています。
取得したデータをテーブルに渡してv-forにてtrを生成したいと考えています。
vuexを使用した方法は理解したのですが、そこまで大きいアプリケーションでは無いため、vue単体で管理したいと考えています。

恐らく、
年選択 -> index -> テーブル
といった一方向で渡す形になるのかなと考えてv-bindやpropsで実装しましたが、渡せないといった状況になります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでどうでしょうか?

年選択

html

1<template> 2 <select :value="year" @change="onchange"> 3 <option v-for="year in years" :key="year" :value="year">{{year}}</option> 4 </select> 5</template> 6 7<script> 8export default { 9 props: { 10 year: { 11 type: Number, 12 default: new Date().getFullYear() 13 } 14 }, 15 methods: { 16 onchange (e) { 17 this.$emit('year-changed', parseInt(e.target.value, 10)) 18 } 19 } 20} 21</script>

index

html

1<template> 2 <div> 3 <year-select :year="year" @year-changed="onYearChanged" /> 4 </div> 5</template> 6 7<script> 8export default { 9 data () { 10 return { 11 year: new Date().getFullYear() 12 } 13 }, 14 methods: { 15 onYearChanged (newYear) { 16 this.year = newYear 17 // 検索などの処理 18 } 19 } 20} 21</script>

投稿2018/01/23 08:04

編集2018/01/23 10:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SystemRyota

2018/01/23 09:12

ご回答ありがとうございます。 koel(https://github.com/phanan/koel)を参考に開発しているのですが、親に子のメソッドを実装するのはコンポーネント型としてはアンチパターンだと思っています。 storeを利用しない場合はemitを使用するしか無いのでしょうか。
退会済みユーザー

退会済みユーザー

2018/01/23 09:31

> storeを利用しない場合はemitを使用するしか無いのでしょうか。 storeを利用しない場合は子→親への通信は emit を利用したイベント通信が一般的だと思います。 年選択コンポーネントに検索処理を書きたければ、検索結果をemitで親に渡す→親がテーブルに渡すということもできます。 私は年選択+テーブルが検索コンポーネントであり、年選択とテーブルはそれぞれ単一の責務を持つ部品コンポーネントと考えました。 ですので、検索処理および各データは親が持つべきではないかと思います。Vuexでいうstateとmutationを親が兼ねるという形ですね。
sakapun

2018/01/23 09:34

親が作ったメソッドを子で実行しているわけではなく、コレはアンチパターンではありません。 このemitパターンが正しいです。
SystemRyota

2018/01/23 14:47

そうなんですね! ご教示頂いた方法で実装致します。 ありがとうございました。
guest

0

ざっくりですが、propsの利用はこういった形で渡せないでしょうか。

index

<template> <div> <search-form/> <search-result :lists="searchList"/> </div> </template> <script> export default { data() { return { searchList: [], }; }, components: { SearchForm, SearchResult, }, //︙ }; </script>

テーブル

<template> <div> <table> <tr v-for="(list,index) in lists"> <!-- // ︙ --> </table> </div> </template> <script> export default { props: { lists: { type: Array, default: [], required: true, }, }, }; </script>

投稿2018/01/23 07:01

編集2018/01/23 07:02
hiro0218

総合スコア68

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

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

SystemRyota

2018/01/23 07:28

ご回答ありがとうございます。 子から親にデータを渡す時(年選択->index)はどういった記述になるのでしょうか。
hiro0218

2018/01/23 11:47

他の回答にもある通り `$emit` で渡すのがセオリーかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問