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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3917閲覧

修正:vueでaxiosで取得した結果がv-forに反映されない

garchomp

総合スコア128

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/09/06 05:50

編集2018/09/06 11:27

環境
javascriptフレームワーク:vue
クロスプラットフォーム:onsen ui

html

1 <component 2 v-for="category in allCategories" 3 :is="CategoryIndexPage" 4 :key="category.id" 5 :title="category.title" 6 :image="category.image" 7 PropsWidth="25" 8 :page-stack="pageStack" 9 class="all-category" 10 ></component>

js

1import JoinCategory from '../Category/components/JoinCategory' 2import MenuPage from './MenuPage' 3import CategoryIndex from '../Category/Index' 4export default { 5 name: 'home', 6 props: ['pageStack'], 7 data () { 8 return { 9 title: 'title', 10 CategoryIndexPage: CategoryIndex, 11 JoinCategoryPage: JoinCategory, 12 allCategories: [ 13 { 14 id: 0, 15 image: 'block.jpg', 16 title: 'hogehoge' 17 } 18 ] 19 } 20 }, 21 created: function () { 22 this.allCategories.push({ id: 10, title: 'hoge', image: 'block.jpg' }) 23 const self = this 24 var listSet = [] 25 this.axios 26 .get(process.env.BASE_URL + 'all_category') 27 .then(function (res) { 28 listSet = res.data 29 self.categoryListUpdate(listSet) 30 }) 31 }, 32 methods: { 33 categoryListUpdate (listSet) { 34 for (var i = 0; i < listSet.length; i++) { 35 var items = listSet[i] 36 this.allCategories.push({ id: items.id, title: items.title, image: items.image }) 37 } 38 console.log(this.allCategories) 39 } 40 }

上記のようなデータがあったとします。
やりたいこととしては、axiosで取得したデータをv-for回して結果に表示することです。

まず、挙動を確認すると、created直下のpushはビューにちゃんと反映されていることは確認しました。
一方、axiosで取得したデータはビューに反映されていませんでした。
ただ、methodsにあるconsole.logにはちゃんと表示されていました。

おそらくレンダリングが向こうになっている可能性があると思い、createdをmountedに変えてみたら、今度は一行目のpush(idが10のもの)もビューに反映されていませんでした。

マウントしたあと、pushでビューに結果を更新するために必要な作業、また足りていない部分は何になるでしょうか?

長くなりましたが、もしわかりましたらご教授お願いします。

追記:コンポーネント側からconsole.logしてみたら、ちゃんとaxiosのデータが渡っていることは確認できました。

html

1 <component 2 v-for="category in allCategories" 3 :is="CategoryIndexPage" 4 :key="category.id" 5 :title="category.title" 6 :image="category.image" 7 :categoryAll="category.title" 8 PropsWidth="25" 9 :page-stack="pageStack" 10 class="all-category" 11 ></component>

categoryAllを追加

js

1 mounted: function () { 2 console.log(this.categoryAll) 3 }

categoryAll内でサーバーのデータを表示されていることを確認
ただ、画面の更新(だけ)がされていない状態です…]

追記:別プロジェクトで、nuxtで実験してみたところ、うまく行きました!
ただ、onsen uiの方は相変わらずうまく行っていないです…

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

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

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

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

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

guest

回答2

0

自己解決

いろんな方に質問したり調べてみたところ、どうやらonsen ui側のバグの可能性が高かったため、現在issueしています。回答してくださった方、本当にありがとうございますm(_ _)m

投稿2018/09/06 13:45

garchomp

総合スコア128

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

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

0

Vueはそこまで詳しくないのですが、
一度このような書き方に変えてもらってもいいですか?

methods: { categoryListUpdate (listSet) { var allCategories = []; for (var i = 0; i < listSet.length; i++) { var items = listSet[i] allCategories.push({ id: items.id, title: items.title, image: items.image }) } this.allCategories = allCategories; } }

this.allCategoriesは配列(オブジェクト)なのでその中身の変更をVueが検知出来てないのではないかと思います。

あとはこんなやり方とかでしょうか。
https://qiita.com/Keitaro/items/8e3f8448d1a0fe281648

投稿2018/09/06 06:13

keisukeh

総合スコア657

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

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

garchomp

2018/09/06 06:45

現在watchで監視ししていますが、dataオブジェクトは正常に変更されているみたいです。 ただ、dataは変更されているにもかかわらず、更新されないのでmvvmに実質なっていない形になりますね…???? 他の原因もありそうなので探ってみます(ちなみに現在onsen uiを使って開発しています
keisukeh

2018/09/06 07:45

data自体の変更はされていると思うのですが、変更されたかどうかが検知がVueで出来ないのではないでしょうか?
garchomp

2018/09/06 07:59

おそらくそれかなと思ってcomponentからpropsをconsole.logしてみましたが、データ自体はコンポーネントに来ているみたいです。 なので、おそらく検知できていない可能性があると思います…
keisukeh

2018/09/06 08:02 編集

変更を検知させるためにはallCategoriesの中のプロパティを変えても検知出来ないので allCategories自体の参照先をまるっと変更させる必要があります。 この部分です。 this.allCategories = allCategories;
keisukeh

2018/09/06 08:08

やってみてうまくいかないようなら categoryListUpdate 内で this.allCategories = [{ id: 11, title: 'huge', image: 'block.jpg' }]; これも試してみてください
garchomp

2018/09/06 08:15

うまく行かないですね… ただ、createdで this.allCategories.push({ id: 12, title: 'huge', image: 'block.jpg' }) というふうにやり、categoryListUpdateで this.allCategories = allCategories を無効にすると、id12は表示されました。 ただし、categoryListUpdateのコメントを外すと、今度は1軒も表示されなくなります。 categoryListUpdate内のthis.allCategories = allCategoriesの書き方に問題があることまではわかりました。 また、category(ry で this.allCategories.push({ id: 12, title: 'huge', image: 'block.jpg' }) をしたらうまく行かず this.allCategories = [{ id: 11, title: 'huge', image: 'block.jpg' }] を試してもうまく行きませんでした
keisukeh

2018/09/06 08:25

APIから取ってきたデータの1番目って { id: 0, image: 'block.jpg', title: 'hogehoge' } これと同じですか?
keisukeh

2018/09/06 08:27

createdで入れた値が反映されるのは初期マウント前なので初回マウントするときにその値を見るというのはわかるのですが。
garchomp

2018/09/06 08:30 編集

{ id: 1, image: 'block.jpg', title: 'hogehoge' } idはコレの連番です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問