前提・実現したいこと
Vue.jsを使ってローカルのJSONファイルを読み込んでその内容を表示したいです。
下記のような実装で表示はできたのですが prefecture
タグの数だけファイルを読み込むのでこの読み込みを一度だけに
したいのですがなにかいい方法はないでしょうか?
prefecture
タグの上になにか親コンポーネントをつくって渡せないかと思ったのですが画面によって prefecture
タグの数が
異なるのでいまいち親コンポーネントの作り方がわからず...
vueあまりさわったことないので、このサイトとか参考になるとかあれば教えていただければ幸いです。
該当のソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title>test</title> 7 </head> 8 <body> 9 <div id="app"> 10 <prefecture pre_id="0001"></prefecture> 11 <prefecture pre_id="0002"></prefecture> 12 <prefecture pre_id="0003"></prefecture> 13 </div> 14 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 15 <script src="index.js"></script> 16 </body> 17</html>
javascript
1function readJSON(path, callback) { 2 var xhr = null; // 使える場合はMicrosoft.XMLHTTP, 使えない場合はXMLHttpRequest 3 try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { xhr = new XMLHttpRequest(); } 4 xhr.open("GET", path, true); 5 xhr.onreadystatechange = function(){ 6 if(xhr.readyState === 4) { 7 var data = xhr.responseText; // 外部ファイルの内容 8 var json = JSON.parse(data); 9 callback(json); 10 } 11 }; 12 xhr.send(); 13} 14 15Vue.component('prefecture', { 16 props: ['pre_id'], 17 template: '<div><p>{{ pre_id }}</p><p>{{ name }}</p><p>{{ city }}</p></div>', 18 data: ()=> { 19 return { 20 name: "", 21 city: "" 22 } 23 }, 24 mounted: function () { 25 var self = this; 26 readJSON("index.json", function(json){ 27 var target = json.filter(x => x.pre_id === self.pre_id)[0]; 28 self.name = target.name; 29 self.city = target.city; 30 }) 31 } 32}) 33 34var app = new Vue({ 35 el: '#app', 36 data: { 37 38 } 39})
json
1[ 2 { 3 "pre_id": "0001", 4 "name": "滋賀県", 5 "city": "大津市" 6 }, 7 { 8 "pre_id": "0002", 9 "name": "京都府", 10 "city": "京都市" 11 }, 12 { 13 "pre_id": "0003", 14 "name": "大阪府", 15 "city": "大阪市" 16 }, 17 { 18 "pre_id": "0004", 19 "name": "兵庫県", 20 "city": "神戸市" 21 }, 22 { 23 "pre_id": "0005", 24 "name": "奈良県", 25 "city": "奈良市" 26 }, 27 { 28 "pre_id": "0006", 29 "name": "和歌山県", 30 "city": "和歌山市" 31 } 32]
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/15 04:37