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

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

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

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

Q&A

解決済

2回答

195閲覧

Vue.jsのfor文内にある子コンポーネントから状態を取得して親コンポーネントを処理する場合、for全件分行わずに処理する方法はないか?

nieve

総合スコア33

Vue.js

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

0グッド

0クリップ

投稿2020/02/12 04:52

編集2020/02/12 05:09

配列に格納されたデータを全件リストで表示しつつ、
そのデータを使ってboolean値が算出。
その結果を親コンポーネントで表示したいです。

親コンポーネントで取得したい条件としては、
デフォルトはfalse ただし、データから算出した結果に1つでもtrueがあればtrueにする
という内容です。
子コンポーネント側でも、自身の結果を表示します。


※イメージとしては、
ToDoリストがあり、データのなかに期日がある。
期日が全部未来だったら親コンポーネント的には何もおきないけど、
過去日のものが含まれていたらアラートを表示する
のような感じです。


ということで、下記よのうなコードを記載したのですが、
これって、例えばデータが100件あって、1個めでtrueが返ってきても、全件処理してしまうのがとてもムダに感じています。
なにか検知したらとめるような方法はないでしょうか?

※ リクエスト:
できれば、子コンポーネントごとの条件算出は子コンポーネントで行いたいです。

vue

1【parent】 2 3<template> 4 <p>{{ state }}</p> 5 6 <el-child 7 v-for = "item in items" 8 :data = data 9 @catchChildState = "changeState" 10 /> 11</template> 12 13<script> 14export default { 15 data() { 16 return { 17 states: [], 18 state: false, 19 data: いくつか情報の入ったオブジェクト 20 } 21 } 22 methods { 23 changeState(d) { 24 this.states.push(d) 25 this.state = this.states.some(val => val == true); 26 } 27 } 28} 29</script> 30

vue

1【child】 2 3<template> 4 <div> 5 データの表示 6 {{ state }} 7 </div> 8</template> 9 10 11<script> 12export default { 13 props: ['data'], 14 data() { 15 return { 16 state: false 17 } 18 }, 19 mounted() { 20    if (dataを使ってなにか条件式) { 21 this.state = true; 22 } else { 23 this.state = false; 24 } 25 this.$emit('catchChildState', this.state); 26 } 27} 28</script> 29

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

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

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

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

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

guest

回答2

0

ありがとうございます!
む~親でおまとめしなくては。。。ですか。。。(残念。。)

とはいえ、
子コンポーネントで組むと、もっさりしてるな~~と思ったのですが、(実測してないのでほんとか??ですが。)
親コンポーネントにすることで、少し早くなった気がします。(実測してない。。以下同文。)

親コンポーネントにお願いするように変更して
実際に書いたものに近いもの記載します。
dataのオブジェクトのプロパティをいじるようになっています。

※アラートを出す条件を他にマウントしているコンポーネントによって切り替える という仕様がそもそもあるので、最初の質問と違うコンポーネントが登場します。

オブジェクトの中身を書き換えるより、単独のプロパティデータの方が処理が速かったりするのだろうか。。。

vue

1【parent】 2 3<template> 4 <div> 5 <change-mode @changeState="updateData" /> 6 7 <p>{{ state }}</p> 8 9 <el-child 10 v-for = "item in items" 11 :data = data 12 /> 13 </div> 14</template> 15 16<script> 17export default { 18 data() { 19 return { 20 state: false, 21 data: いくつか情報の入ったオブジェクト 22 } 23 }, 24 mounted(){ 25 this.updateData(); 26 }, 27 methods { 28 updateData(d) { 29 let flg = false; 30 this.list_items.forEach(el => { 31 if(data.hogehogeと、mode設定から渡されたdで条件) { 32 this.$set(el, 'state', true) 33 flg = true 34 } else { 35 this.$set(el, 'state', false) 36 } 37 }) 38 this.state = flg 39 } 40 } 41} 42</script>

vue

1【child】 2 3<template> 4 <div> 5 {{ data.hoge }} 6 {{ data.state }} 7 </div> 8</template> 9 10 11<script> 12export default { 13 props: ['data'] 14} 15</script>

投稿2020/02/12 07:59

nieve

総合スコア33

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

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

0

ベストアンサー

「止める」つまりforのbreakやreturnのような処理は困難だと思います。
propsでstatesを送ってtrueが含まれているときは処理しないようにすることは可能です。

ただし、そこまで親と子でデータを行き来させてしまうと複雑で密結合な設計になってしまいます。
ご希望の方法ではないかもしれませんが親で一括処理したデータをコンポーネントに送ったほうがスマートな実装になると思いますので参考程度にコードを載せておきます。(以下は不明な箇所を一部動くように補っています)

vue

1<template> 2 <div> 3 <p>{{ state }}</p> 4 <el-child v-for="(item, index) in items" :state="states[index]"> 5 {{ item }} 6 </el-child> 7 </div> 8</template> 9 10<script> 11export default { 12 data() { 13 return { 14 items: ['hoge', 'fuga'], 15 data: { hoge: 'hoge' } 16 } 17 }, 18 computed: { 19 states() { 20 return this.items.map(el => el === this.data.hoge) 21 }, 22 state() { 23 return this.states.includes(true); 24 } 25 } 26} 27</script>

vue

1<template> 2 <div> 3 <slot/> 4 {{ state }} 5 </div> 6</template> 7 8 9<script> 10export default { 11 props: ['state'] 12} 13</script>

投稿2020/02/12 07:25

nt4c

総合スコア768

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問