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

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

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

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2212閲覧

axiosでポストして帰ってきたデータがVueのv-modelに再描画されない

m_yoko

総合スコア156

Vue.js

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2017/12/04 01:48

編集2017/12/04 01:52

###前提・実現したいこと
Vue.jsのテキストボックスにサーバーから取得したデータを表示したいのですが、その前にまずaxiosのポストした処理のthenでなぜかデータが反映されません。
###発生している問題・エラーメッセージ
vue側でデータの再描画が行われない

###該当のソースコード

Html

1<script src="https://npmcdn.com/vue/dist/vue.js"></script> 2<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css"></script> 3<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 4<script src="https://unpkg.com/axios/dist/axios.min.js"></script> 5 <div class="container" id="app"> 6 <div class="row"> 7 <div class="col-sm-5 offset-sm-1"> 8 <div class="card"> 9 <div class="card-header">顧客一覧</div> 10 <div id="app"> 11 <div style="overflow: auto; width:auto; height: 200px;"> 12 <ul class="list-group" id="consumerList"> 13 <li style="height: 50px" class="list-group-item" 14 v-on:click="consumerListClick(index)" v-for="(num,index) in displayList"> 15 <a href="#">{{index}}:{{num}}</a> 16 </li> 17 </ul> 18 </div> 19 </div> 20 </div> 21 </div> 22 <div class="col-sm-5"> 23 <div class="card"> 24 <div class="card-header">顧客詳細情報</div> 25 <div id="app"> 26 <input type="text" v-model="costomerInfomationCompted" class="form-control" placeholder="顧客名"> 27 </div> 28 </div> 29 </div> 30 </div> 31 </div> 32

Javaxcript

1var cosutomerInfomationList = ['1','2']; 2var clickCostomerInfomation ='test'; 3var costomerNameList = ['1','2']; 4function CosutomerInfomation() { 5 this.id='-100'; 6 this.name='dummy_name'; 7 this.gender='E'; 8 this.birthday='1990-01-01'; 9} 10 11 12 13new Vue({ 14 el: '#app', 15 data: function () { 16 return { 17 cosutomerInfomationList: cosutomerInfomationList, 18 costomerNameList:costomerNameList, 19 clickCostomerInfomation:clickCostomerInfomation, 20 } 21 }, 22 computed: { 23 displayList: function () { 24 this.cosutomerInfomationList.forEach( 25 function (cosutomerInfomation) { 26 // this.costomerNameList.push(cosutomerInfomation.name); 27 } 28 ); 29 return this.costomerNameList; 30 }, 31 costomerInfomationCompted: { 32 get: function() { 33 return this.clickCostomerInfomation; 34 }, 35 set : function(newValue) { 36 this.clickCostomerInfomation = newValue; 37 } 38 }, 39 40 41 42 }, 43 methods: { 44 getCostomerInfomaitonAll: function (num) { 45 axios.post('/api/post/getjson', { id: '-1', name: '', gender: '', birthday: '' }) 46 .then(function (response) { 47 console.log(response); 48 this.cosutomerInfomationList.splice(0); 49 this.costomerNameList.splice(0); 50 for(var i=0;i<response.data.length;i++){ 51 this.cosutomerInfomationList.push(response.data[i]); 52 this.costomerNameList.push(response.data[i].name); 53 } 54 Vue.set(this,clickCostomerInfomation,'new message');//ここが反映されない 55 this.clickCostomerInfomation = 'new message';//ここが反映されない 56 this.costomerInfomationCompted='a';//ここが反映されない 57 this.$nextTick();//ここが反映されない 58 vue.$forceUpdate()//ここが反映されない 59 }) 60 .catch(function (error) { 61 console.log(error); 62 63 }); 64 }, 65 66 consumerListClick: function (num) { 67 // メソッド内の `this` は、 Vue インスタンスを参照します 68 thix.getCostomerInfomaitonAll(0); 69 // `event` は、ネイティブ DOM イベントです 70 }, 71 }, 72}) 73 74

###試したこと
computedでどうにかしようとしたり、nexttickを使ってみたり、forceupdateを使ってみたりしましたが、なぜか入れ直したデータで再描画されません。

###補足情報(言語/FW/ツール等のバージョンなど)
Vue.js v2.5.2
Bootstrap 4.0.0-beta.2
jquery 3.2.1
axios v0.17.1

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

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

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

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

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

karamarimo

2017/12/04 08:56

consumerListClick のところで thix となってますが、ソースのほうでは this になってますでしょうか。
karamarimo

2017/12/04 08:57

Vue.set(this,click... とコンマになってます。
m_yoko

2017/12/04 09:26

写しミスでした。ソースの方はthisになっております。setは変更したいオブジェクトが第一引数なのでthisを入れたのですが、間違いでしょうか?
guest

回答1

0

ベストアンサー

基本的にVueはdataが変更されると自動的に表示が更新されるので forceupdate などをする必要はありません。

Vue.setを使うのはdata内のオブジェクトにキーを追加するときや、配列のあるインデックスに値を代入するときぐらいです。

Array Change Detection

原因としてはthen内でthisが指しているのは Vue instance ではないからです。console.logしてみると確かめられます。

解決策としては、3つぐらいあります。

  • arrow function

lang

1.then(response => { 2 // "this" points to the vue instance 3})
  • bind

lang

1.then(function (response) { 2 // "this" points to the vue instance 3}.bind(this))
  • this の退避

lang

1const self = this 2 3// ... 4.then(function (response) { 5 // "self" points to the vue instance 6})

関連リソース
JavaScript の this を理解する多分一番分かりやすい説明 - Qiita

投稿2017/12/04 10:02

編集2017/12/04 10:03
karamarimo

総合スコア2551

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

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

m_yoko

2017/12/05 01:24

アローファンクションでやってみます!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問