多次元配列オブジェクトを一定のルールで横並びさせたいです。
map関数のループ中にCSSのpositionのtop, leftの値を取得して配列内の別の値をそのposition通りに、Vue.jsのfor文で出力したいのですが、topの値を思ったように取得できません。どなたか力をお貸しください。
やりたいこと
CSSのtopを合わせたい
現状
ループされるたびにtopを生成するため一定の間隔になっています。
topとleftを生成するために配列オブジェクトをmap関数でループします。その時leftの値をmoment.jsを使用してもとめます。topは一回ループするたびに値を取得したいのですが、現状一定の値であるため、task_codeごとにtopを取得するためにはどうすればよいでしょうか。
以下,コードです。お粗末だと思いますが、お力をお貸しください。
javascript
1// data.js 2export default 3[ 4 [ // user_id:1 start 5 [ 6 { 7 input_time: 8, 8 user_id: 1, 9 task_code: "100", 10 daily_day: "2021-02-01" 11 }, 12 { 13 input_time: 8, 14 user_id: 1, 15 task_code: "100", 16 daily_day: "2021-02-02" 17 }, 18 { 19 input_time: 8, 20 user_id: 1, 21 task_code: "100", 22 daily_day: "2021-02-08" 23 } 24 ], 25 [ 26 { 27 input_time: 8, 28 user_id: 1, 29 task_code: "101", 30 daily_day: "2021-02-03" 31 } 32 ] 33 ],// user_id:1 end 34 [ // user_id:2 start 35 [ 36 { 37 input_time: 5, 38 user_id: 2, 39 task_code: "105", 40 daily_day: "2021-02-01" 41 }, 42 { 43 input_time: 8.5, 44 user_id: 2, 45 task_code: "105", 46 daily_day: "2021-02-02" 47 }, 48 ], 49 [ 50 { 51 input_time: 0.5, 52 user_id: 2, 53 task_code: "100", 54 daily_day: "2021-02-01" 55 }, 56 { 57 input_time: 3.5, 58 user_id: 2, 59 task_code: "100", 60 daily_day: "2021-02-04" 61 } 62 ], 63 [ 64 { 65 input_time: 1, 66 user_id: 2, 67 task_code: "103", 68 daily_day: "2021-02-01" 69 } 70 ] 71 ] 72]
javascript
1<template> 2 <div> 3 <div class="p_hello"> 4 <div v-for="(d, index) in fn" :key="`first-${index}`" class="first"> 5 <div v-for="(i, index) in d" :key="`seconde-${index}`" class="seconde"> 6 <div v-for="(j, index) in i" :key="`third-${index}`"> 7 <div class="third" :style="j.style" :class="inputColor(j.item.input_time)"> 8 {{j.item.input_time}} 9 </div> 10 </div> 11 </div> 12 </div> 13 </div> 14 </div> 15</template> 16 17<script> 18import moment from 'moment' 19import data from '../assets/api/data' 20// console.log('data', data) 21 22export default { 23 data () { 24 return { 25 data, 26 date: '2021-02-01', 27 size: 30 28 } 29 }, 30 computed : { 31 fn () { 32 const start = moment(this.date) 33 let top = 20 34 let style 35 return this.data.map(value => { 36 return value.map(value => { 37 return value.map(item => { 38 const from = moment(item.daily_day) 39 let diff = from.diff(start, 'days') 40 let left = diff * this.size 41 style = { 42 top: `${top}px`, 43 left: `${left}px`, 44 color: 'black' 45 } 46 top = top + 40 47 48 return { 49 style, 50 item 51 } 52 }) 53 }) 54 }) 55 } 56 }, 57 methods: { 58 inputColor(input) { 59 if (input > 7) { 60 return 'green' 61 } 62 if (input < 4) { 63 return 'red' 64 } 65 } 66 } 67} 68</script> 69 70 71<style> 72 .first { 73 position: relative; 74 display:flex; 75 } 76 .seconde { 77 position: relative; 78 display: flex; 79 80 background-color:azure; 81 82 } 83 84 .third { 85 position: absolute; 86 font-size: 20px; 87 } 88 .green { 89 background: rgb(153, 235, 210); 90 } 91 .red { 92 background: rgb(236, 81, 127); 93 } 94</style> 95 96 97
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/15 16:09
2021/04/10 00:57