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

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

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

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

Q&A

解決済

1回答

1866閲覧

【Vue.js】for文で複数個作ったselect文の差別化がしたい

yaenopikomaro

総合スコア2

Vue.js

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

0グッド

0クリップ

投稿2021/11/05 06:16

プログラミング初心者なので見当違いの質問をしていたらすみません。

前提

日付ごとに勤務可能時間を入力できるシフト希望表みたいな機能を作っています。
1週間/2週間/1ヶ月で表示を切り替える事が出来、切り替えに応じてその期間分の日付と希望プルダウンを入力させるようにしたい。
イメージ説明

問題点

forで期間分の日付の数分selectを表示させるようにしたところ、同じselectが生成されているからか一つのセレクトボックスを選択するとすべてのセレクトボックスの値が変更されてしまいます。
イメージ説明そのほかにもいろいろな問題がありますが今回はそのselectボックスの差別化を図るにはどうしたらいいのかを聞きたいです。よろしくお願いいたします。

html

1 <select v-model="dateselects" id="dataselect"> 2 <option key="">--選択してください--</option> 3 <option v-for="(date, index) in getdates" :key="index" :value="date">{{ date.text }}</option> 4 </select> 5 <select v-model="periodselect"> 6 <option value="">--選択してください--</option> 7 <option value="week">1週間</option> 8 <option value="twoweek">2週間</option> 9 <option value="month">1ヶ月</option> 10 </select><button @click="siftinput">表示</button> 11 12 <div class="timesheet" v-if="isSiftinput"> 13 <div v-for="(date, index) in getdates" :key="index" :value="date">{{ date.text }}> 14 <div class="selectcolumn"> 15 <div class="selectedDate"></div> 16 <select> 17 <option value="">-▼</option> 18 <option value="maru"></option> 19 <option value="sankaku"></option> 20 <option value="batsu">×</option> 21 </select> 22 <select v-model="startTimeHour"> 23 <option v-for="(h, index) in startTimeHour" :key="index" :value="h">{{ h }}</option> 24 </select>25 <select v-model="startTimeMinutes"> 26 <option v-for="(m, index) in startTimeMinutes" :key="index" :value="m">{{ m }}</option> 27 </select>分~ 28 <select v-model="leavingTimeHour"> 29 <option v-for="(hh, index) in leavingTimeHour" :key="index" :value="hh">{{ hh }}</option> 30 </select>31 <select v-model="leavingTimeMinutes"> 32 <option v-for="(mm, index) in leavingTimeMinutes" :key="index" :value="mm">{{ mm }}</option> 33 </select>34 </div> 35 </div> 36 </div>

js

1export default { 2 data:function(){ 3 return{ 4 isActive:true, 5 isTimeSheet:true, 6 isSiftinput:false, 7 getdates:this.getdate(), 8 hour:["-▼","09",10,11,12,13,14,15,16,17,18,19,20,21,22,23], 9 minutes:["-▼","00",10,20,30,40,50], 10 startTimeHour:["-▼","09",10,11,12,13,14,15,16,17,18,19,20,21,22,23], 11 startTimeMinutes:["-▼","00",10,20,30,40,50], 12 leavingTimeHour:["-▼","09",10,11,12,13,14,15,16,17,18,19,20,21,22,23], 13 leavingTimeMinutes:["-▼","00",10,20,30,40,50] 14 } 15 }, 16 methods: { 17 active: function() { 18 this.isActive = !this.isActive; 19 }, 20 timesheet: function() { 21 this.isTimeSheet = !this.isTimeSheet; 22 }, 23 siftinput: function() { 24 const syear = this.date.year; 25 const smonth = this.date.month-1; 26 const sdate = this.date.date; 27 let prioddate2; 28 if(this.priod==="week"){ 29 console.log("isshuukan"); 30 prioddate2 = this.prioddate(syear,smonth,sdate,7); 31 }else if(this.priod==="twoweek"){ 32 console.log("nishuukan"); 33 prioddate2 = this.prioddate(syear,smonth,sdate,14); 34 }else if(this.priod==="month"){ 35 console.log("ikkagetu"); 36 prioddate2 = this.prioddate(syear,smonth,sdate,30); 37 }else{ 38 console.log("nyuuryokusitekudasai"); 39 } 40 console.log(prioddate2); 41 this.isSiftinput = true; 42 return prioddate2 43 }, 44 getdate: function() { 45 const today = new Date(); 46 const syear = today.getFullYear(); 47 const smonth = today.getMonth(); 48 const sdate = today.getDate() 49 return this.prioddate(syear,smonth,sdate,15); 50 }, 51 prioddate: function(syear,smonth,sdate,priod){ 52 const selectdates=[]; 53 const week = ['日', '月', '火', '水', '木', '金', '土'] 54 //取得する日付の値を設定 55 let date = new Date(syear,smonth,sdate); 56 for(let i = 0; i < priod; i++){ 57 //値から日付を取得 58 date = date.getTime() + i * 86400000; 59 date = new Date(date); 60 //dateから年月日曜を取得 61 let y = date.getFullYear(); 62 let m = date.getMonth()+1; 63 let d = date.getDate(); 64 let w = date.getDay(); 65 //月を2桁に揃える 66 if(m < 10){ m = '0'+m }; 67 //日を2桁に揃える 68 if(d < 10){ d = '0'+d }; 69 //出力形式 70 let textFormat = y+'年'+m+'月'+d+'日'+'('+week[w]+')'; 71 selectdates.push({"text":textFormat,"year":y,"month":m,"date":d,"week":week[w]}); 72 } 73 return selectdates; 74 } 75 }, 76 computed:{ 77 dateselects:{ 78 get(){ 79 let date = this.date //ここからsetterの値を引っ張ってくる 80 return date 81 }, 82 set(date){ 83 this.date = date; 84 } 85 }, 86 periodselect:{ 87 get(){ 88 const selected = this.value; 89 return selected; 90 }, 91 set(priod){ 92 this.priod = priod; 93 } 94 } 95 } 96} 97

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

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

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

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

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

guest

回答1

0

ベストアンサー

<select v-model="startTimeHour"> で、同じmodelを使用しているのが原因です。
とりあえずv-model="startTimeHour"を消せばそれぞれ選択できるようになります。

投稿2021/11/05 08:17

D0NKAMA

総合スコア28

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

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

yaenopikomaro

2021/11/07 23:01

ありがとうございます!おかげさまで解決いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問