vue渲染三个场地,每个场地都有48个时段纵向排布,且点击某个场地的时段变色,其他场地的不变色,禁止点击
时间: 2023-05-23 16:06:39 浏览: 84
A: 实现这个需求可以采用Vue中的指令和事件绑定。先在Vue实例中定义一个`timeTable`数组,数组中包含三个子数组,每个子数组表示一个场地的时段信息。然后在模板中使用`v-for`指令循环渲染出三个场地的时段表格,并为每个时段绑定一个`click`事件。当点击某个时段时,触发事件处理函数,将该时段的状态变为选中,并将该场地以外的所有时段的状态设置为未选中。可以使用Vue的计算属性来控制每个时段的样式类,根据时段是否选中动态绑定`class`属性实现变色效果。
同时,禁止点击可以在事件处理函数中判断当前时段是否已选中,如果已选中则不做任何操作,否则才执行更新状态和变色的操作。完整代码如下:
```html
<template>
<div>
<table>
<thead>
<tr>
<th>场地</th>
<th v-for="(time, index) in times">{{index+1}}时段</th>
</tr>
</thead>
<tbody>
<tr v-for="(venue, i) in timeTable">
<td>场地{{i+1}}</td>
<td v-for="(time, j) in venue"
:class="{'selected': time.selected}"
@click="selectTime(i, j)">
{{indexToTime(j)}}
</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
data() {
return {
timeTable: [
[{id: 1, selected: false},{id: 2, selected: false},...],
[{id: 3, selected: false},{id: 4, selected: false},...],
[{id: 5, selected: false},{id: 6, selected: false},...],
],
times: Array.from({length: 48}, (_, i) => i),
}
},
methods: {
selectTime(venueIndex, timeIndex) {
if (this.timeTable[venueIndex][timeIndex].selected) return; // 已选中则不做任何操作
this.timeTable[venueIndex] = this.timeTable[venueIndex].map(t => {
t.selected = false;
return t;
}); // 该场地的所有时段置为未选中
this.timeTable[venueIndex][timeIndex].selected = true; // 点击的时段置为选中
},
indexToTime(index) {
// 将时段索引转换为具体时间
let hour = Math.floor(index / 2);
let minute = (index % 2 === 0) ? '00' : '30';
return `${hour}:${minute}`;
}
}
}
</script>
```
样式方面,可以在样式文件中定义`selected`类用于改变选中时段的背景色,如:
```css
.selected {
background-color: #eee;
}
```
阅读全文