请给出详细代码 并加注释
时间: 2024-10-09 21:10:59 浏览: 42
当然,下面是一个详细的代码示例,包含注释解释每一部分的功能:
```html
<!-- 使用 <template> 标签定义模板结构 -->
<template>
<div>
<div v-for="(timeSlot, index) in timeSlots" :key="index" class="flex-container">
<!-- 开始时间选择器 -->
<TimePicker
v-model="timeSlot.startTime" {/* 绑定开始时间给每个timeSlot */}
:disabled="index === 0" {/* 首个时间不允许编辑 */}
:placeholder="index === 0 ? '00:00' : '开始时间'" /* 首次提示默认时间 */
@change="(val) => handleStartTimeChange(index, val)" /* 触发handleStartTimeChange事件 */
:format="format" /* 时间格式化选项 */
:options="timeOptions" /* 其他时间选项 */
style="margin-right: 10px;"
></TimePicker>
<div>至</div> /* 连接开始和结束时间 */
<!-- 结束时间选择器 -->
<TimePicker
v-model="timeSlot.endTime" {/* 同样绑定结束时间 */}
:disabled="index === timeSlots.length - 1" /* 最后一个时间不允许编辑 */
:placeholder="index === timeSlots.length - 1 ? '24:00' : '结束时间'"
:format="format" /* 时间格式保持一致 */
:options="timeOptions"
style="margin-left: 10px;"
></TimePicker>
</div>
</div>
</template>
<script lang="ts"> /* 使用TS编写脚本 */
import { ref, watch } from "vue";
// 定义timeSlots状态变量,表示时间槽数组
const timeSlots = ref([{ startTime: '', endTime: '' }]);
// 定义format和timeOptions常量或配置
const format = 'HH:mm'; // 时间格式
const timeOptions = {} // 时间选择器选项
// 创建handleStartTimeChange方法
export default {
setup() {
// 定义handleStartTimeChange方法,接收索引和新值作为参数
const handleStartTimeChange = (index: number, value: string) => {
// 当前时间槽
const slot = timeSlots.value[index];
// 如果不是最后一条,检查新值与前一条结束时间是否匹配
if (index < timeSlots.value.length - 1) {
const prevEndTime = slot.endTime;
if (value !== prevEndTime) {
// 提示用户开始时间应等于上一条的结束时间
alert('开始时间需与上一条结束时间一致,请重新设置');
// 将当前时间槽的开始时间重置为上一条的结束时间
slot.startTime = prevEndTime;
} else {
// 如果一致,更新下一条的开始时间
timeSlots.value[index + 1].startTime = value;
}
}
};
// 监听timeSlots变化,自动处理开始时间一致性
watch(timeSlots, (newSlots) => {
for (let i = 1; i < newSlots.length; i++) {
const slot = newSlots[i];
const prevSlot = newSlots[i - 1];
// 每个时间槽处理开始时间
handleStartTimeChange(i, slot.startTime);
}
});
return { timeSlots, handleStartTimeChange };
},
};
</script>
<style scoped> /* 内部样式,只作用于当前组件 */
.flex-container {
display: flex;
align-items: center;
margin-bottom: 10px;
}
</style>
```
上述代码首先创建了一个时间槽的双向数据绑定模板,然后定义了一个方法`handleStartTimeChange`处理时间更改。通过`watch`监听`timeSlots`的变化,每当数组内容变化时会自动调用处理方法保证开始时间的一致性。
阅读全文