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

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

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

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

Q&A

1回答

688閲覧

vue.jsでAPIで取得したデータをAPIで取得したHTMLにバインドしたいです。

sususu

総合スコア99

Vue.js

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

0グッド

0クリップ

投稿2021/01/16 08:20

お世話になります。最近vueを学習し始めたものです。
どなたかご教授頂ければ幸いです。よろしくお願いいたします。

vue.jsでAPIを叩きテンプレートを取得いたします。また同時にそのテンプレートにバインドしたい値もAPIで取得します。この取得したテンプレートに取得した値を入れようとしても値が入らず苦戦しております。コードは下記の通りです。

下記をbase.htmlとします。この中のv-html="screen"に取得したHTMLファイルwriters.htmlを埋め込みます。

html

1<div id="app"> 2 <button v-on:click="getScreen">GetScreen</button> 3 <!-- こちらにデータをバインドしたい --> 4 <div v-html="screen"></div> 5 6 <!-- こちらはデータがバインドされる --> 7 <div v-if="data.writers"> 8 <table border="1"> 9 <tr> 10 <th>ID</th> 11 <th>NAME</th> 12 </tr> 13 <tr v-for="writer in data.writers"> 14 <td>{{ writer.id* }}</td> 15 <td>{{ writer.name }}</td> 16 </tr> 17 </table> 18 </div> 19</div>

埋め込まれるwriters.htmlは下の通りです。base.htmlのバインドされる方と同じコードになりますが、値がバインドされません。

writers.html

1<div v-if="data.writers"> 2 <table border="1"> 3 <tr> 4 <th>ID</th> 5 <th>NAME</th> 6 </tr> 7 <tr v-for="writer in data.writers"> 8 <td>{{ writer.id }}</td> 9 <td>{{ writer.name }}</td> 10 </tr> 11 </table> 12</div>

javascriptは下の通りです。

javascript

1var app = new Vue({ 2 el: '#app', 3 data: { 4 screen: 'No Screen...', 5 data: 'No Data...' 6 }, 7 methods: { 8 getScreen: function () { 9 axios 10 .get('/myapp/get_writers_template') 11 .then(response => (this.screen = response.data)) 12 .catch(error => console.log(error)) 13 axios 14 .get('/myapp/get_writers') 15 .then(response => (this.data = response.data)) 16 .catch(error => console.log(error)) 17 }, 18 } 19});

データの取得とHTMLの取得の順を逆にしてみたりしましたができませんでした。また、コンポーネントを使用しようとしたりしましたが、親で取得したテンプレートを渡す方法を調べたりしているところですがそれで成功するかもわかりません...

どなたかご教授頂ければ幸いです。よろしくお願いいたします。お手数おかけしますがよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ドキュメントにあるようにv-htmlで挿入されるのはプレーンなHTMLなので、その中でVueの構文を用いても機能しません。

screenで表示するHTML構造が常に同じであれば、v-htmlを使わずそのままファイルに書けばOKです。

そうではなくAPIのresponseに応じてテンプレートを出し分けたい状況であれば、表示したいテンプレートの名前だけをAPIで返すようにして、その名前に応じて(v-if<component is="<コンポーネント名>">を用いて)テンプレートを出し分けるようにすればOKです。

投稿2021/02/12 03:59

編集2021/02/12 04:17
Masa-Shin

総合スコア269

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問