多次元配列のdataから、1つ目の選択によって2つ目のselectのoptionが決まり、2つ目のselectの選択よにって3つ目のselectのoptionが決まるものを作りたいです。
例)
■ 配列
スポーツ - 地上のスポーツ(サッカー, 野球)
スポーツ - 水中のスポーツ(水泳, 水球)
食事 - 野菜(キャベツ, レタス)
食事 - 果物(ぶどう, りんご)
HTML
1<select> 2 <option>スポーツ</option> 3 <option>食事</option> 4</select> 5 6// ↑ 「食事」を選択 7 8<select> 9 <option>野菜</option> 10 <option>果物</option> 11</select> 12 13// ↑ 「野菜」を選択 14 15<select> 16 <option>キャベツ</option> 17 <option>レタス</option> 18</select>
上記を実現したく、下記のようなコードを作りましたが、うまくいきませんでした。
html
1<div id="app"> 2 <div> 3 <select name="asset" v-model="itemSelect"> 4 <option v-for="(item, index) of items" :key="item.index" :value="item.name">{{ item.name }}</option> 5 </select> 6 </div> 7 <div> 8 <select name="use" v-model="typeSelect"> 9 <option v-for="(type, index) of getTypes" :key="type.index" :value="type.use">{{ type.use }}</option> 10 </select> 11 </div> 12 <div> 13 <select name="detail" v-model="detailSelect"> 14 <option v-for="(detail, index) of getDetails" :key="detail.index" :value="detail.label">{{ detail.name }}</option> 15 </select> 16 </div> 17 <!-- <input type="text" name="life" value="1"> --> 18</div>
vue.js
1new Vue({ 2 el: "#app", 3 data: function() { 4 return { 5 itemSelect: '建物', 6 typeSelect: '木造・合成樹脂造のもの', 7 detailSelect: '事務所用のもの', 8 items: [ 9 { id: 0, name: '建物', types: [ 10 { tId: 0, use: '木造・合成樹脂造のもの', details: [ 11 {label: '事務所用のもの', life: 24 }, 12 {label: '店舗用・住宅用のもの', life: 22 }, 13 {label: '飲食店用のもの', life: 20 }, 14 {label: '旅館用・ホテル用・病院用・車庫用のもの', life: 17 }, 15 {label: '公衆浴場用のもの', life: 12 }, 16 {label: '工場用・倉庫用のもの(一般用)', life: 15 }, 17 ]}, 18 { tId: 1, use: '木骨モルタル造のもの', details: [ 19 {label: '事務所用のもの', life: 22 }, 20 {label: '店舗用・住宅用のもの', life: 20 }, 21 {label: '飲食店用のもの', life: 19 }, 22 {label: '旅館用・ホテル用・病院用・車庫用のもの', life: 15 }, 23 {label: '公衆浴場用のもの', life: 11 }, 24 {label: '工場用・倉庫用のもの(一般用)', life: 15 }, 25 ]}, 26 ]}, 27 { id: 1, name: '建物附属設備', types: [ 28 { tId: 0, use: 'アーケード・日よけ設備', details: [ 29 {label: '主として金属製のもの', life: 15 }, 30 {label: 'その他のもの', life: 8 }, 31 ]}, 32 { tId: 1, use: '店舗簡易装備', details: [ 33 {label: 'aaa', life: 3 }, 34 ]}, 35 ]}, 36 ], 37 } 38 }, 39 computed: { 40 getTypes: function() { 41 // 選択中の情報を取得 42 let itemName = this.itemSelect; // 1つ目のselect 43 44 // items から選択中のnameを探す 45 const itemResult = this.items.find((v) => v.name === itemName); 46 47 // 2つ目のselectの初期値をセットする 48 this.typeSelect = this.items[itemResult.id].types[0].use; 49 50 // 2つ目のselectのoptionをセットする 51 return this.items[itemResult.id].types; 52 }, 53 getDetails: function() { 54 // 選択中の情報を取得 55 let itemName = this.itemSelect; // 1つ目のselect 56 let typeName = this.typeSelect; // 2つ目のselect 57 58 // items から選択中のuseを探す 59 const itemResult = this.items.find((v) => v.name === itemName); 60 const typeResult = this.items[itemResult.id].types.find((v) => v.use === typeName); 61 62 // 3つ目のselectの初期値をセットする 63 console.log(this.items[itemResult.id].types[typeResult.tId].details[0].label); 64 this.detailSelect = this.items[itemResult.id].types[typeResult.tId].details[0].label; 65 66 // 3つ目のselectのoptionをセットする 67 return this.items[itemResult.id].types[typeResult.tId].details; 68 69 } 70 }, 71});
3つ目のselectの初期値、及び3つ目のselectのoptionが、セットされません。
どうぞ、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。