项目场景:
比如说,老师的课程安排每一天的工作时间是不一样的。
周一10点到11点,14点到15点;周二9点到10点,15点到16点。
周二的时间点又不一样。那怎么处理呢?
我采用tag标签让用户自定义选择
主要代码如下:
<template>
<div>
我是首页
<el-button type="primary" @click="outerVisible = true"
>添加教师,值班时间和地点</el-button
>
<el-dialog title="外层 Dialog" :visible.sync="outerVisible">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="时间">
<el-tag
:key="tag"
v-for="tag in dynamicTags"
closable
:disable-transitions="false"
@close="handleClose(tag)"
>
{{ tag }}
</el-tag>
<el-button class="button-new-tag" size="small" @click="gettime"
>+ 添加值班时间</el-button
>
</el-form-item>
</el-form>
<el-dialog
width="80%"
title="请选择时间"
:visible.sync="innerVisible"
append-to-body
>
请选择日期:
<el-select v-model="form.days" multiple placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-select
><br /><br />
请选择时间:
<el-time-picker
is-range
v-model="form.time"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
>
</el-time-picker>
<div slot="footer" class="dialog-footer">
<el-button @click="innerVisible = false">取 消</el-button>
<el-button type="primary" @click="addTime">添加</el-button>
</div>
</el-dialog>
</el-dialog>
</div>
</template>
<script>
export default {
name: "Home",
data() {
return {
outerVisible: false,
innerVisible: false,
form: {},
dynamicTags: [],
// 星期下拉选项
options: [
{
value: "1",
label: "星期一",
},
{
value: "2",
label: "星期二",
},
{
value: "3",
label: "星期三",
},
{
value: "4",
label: "星期四",
},
{
value: "5",
label: "星期五",
},
],
};
},
methods: {
onSubmit() {
console.log("提交的数据样子", this.dynamicTags);
},
// 获取时间
gettime() {
console.log("我要添加时间了");
this.innerVisible = true;
},
// 添加时间
addTime() {
this.form.days.forEach((item) => {
let times = "";
this.form.time.forEach((val) => {
let hh = val.getHours(); //时
let mm = val.getMinutes(); //分
times += `~${hh}:${mm}`;
});
let beforPush = `${this.changeWeek(item)} ${times.substring(1)}`;
// 判断用户是否重复添加数据(去重操作)
let isOk = this.dynamicTags.every((ishas) => {
//console.log(ishas, beforPush);
return ishas != beforPush;
});
// 如果没用重复的则添加
if (isOk) {
this.dynamicTags.push(beforPush);
}
});
this.innerVisible = false;
},
// 将value对应返回星期几
changeWeek(data) {
let arr = ["星期一", "星期二", "星期三", "星期四", "星期五"];
return `${arr[data - 1]}`;
},
// 删除时间
handleClose(tag) {
this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
},
},
};
</script>
<style scoped>
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
</style>
效果:
最终得到的数据:
配合其他表单:
<template>
<div>
我是首页
<el-button type="primary" @click="outerVisible = true"
>添加教师,值班时间和地点</el-button
>
<el-dialog title="外层 Dialog" :visible.sync="outerVisible">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="活动名称">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="活动区域">
<el-select v-model="form.region" placeholder="请选择活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="活动时间">
<el-col :span="11">
<el-date-picker
type="date"
placeholder="选择日期"
v-model="form.date1"
style="width: 100%"
></el-date-picker>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-time-picker
placeholder="选择时间"
v-model="form.date2"
style="width: 100%"
></el-time-picker>
</el-col>
</el-form-item> -->
<el-form-item label="时间">
<!-- ******* -->
<el-tag
:key="tag"
v-for="tag in dynamicTags"
closable
:disable-transitions="false"
@close="handleClose(tag)"
>
{{ tag }}
</el-tag>
<el-button class="button-new-tag" size="small" @click="gettime"
>+ 添加值班时间</el-button
>
</el-form-item>
<el-form-item label="即时配送">
<el-switch v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="活动性质">
<el-checkbox-group v-model="form.type">
<el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
<el-checkbox label="地推活动" name="type"></el-checkbox>
<el-checkbox label="线下主题活动" name="type"></el-checkbox>
<el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊资源">
<el-radio-group v-model="form.resource">
<el-radio label="线上品牌商赞助"></el-radio>
<el-radio label="线下场地免费"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活动形式">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即创建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
<el-dialog
width="80%"
title="请选择时间"
:visible.sync="innerVisible"
append-to-body
>
请选择日期:
<el-select v-model="form.days" multiple placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-select
><br /><br />
请选择时间:
<el-time-picker
is-range
v-model="form.time"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
>
</el-time-picker>
<div slot="footer" class="dialog-footer">
<el-button @click="innerVisible = false">取 消</el-button>
<el-button type="primary" @click="addTime">添加</el-button>
</div>
</el-dialog>
</el-dialog>
</div>
</template>
<script>
export default {
name: "Home",
data() {
return {
outerVisible: false,
innerVisible: false,
form: {
name: "",
region: "",
days: [],
time: "",
delivery: false,
type: [],
resource: "",
desc: "",
},
dynamicTags: ["标签一", "标签二", "标签三"],
// 星期下拉选项
options: [
{
value: "1",
label: "星期一",
},
{
value: "2",
label: "星期二",
},
{
value: "3",
label: "星期三",
},
{
value: "4",
label: "星期四",
},
{
value: "5",
label: "星期五",
},
],
};
},
methods: {
onSubmit() {
console.log("submit!");
},
// 获取时间
gettime() {
console.log("进入了");
this.innerVisible = true;
},
// 添加时间
addTime() {
console.log("日期", this.form.days);
console.log("时间", this.form.time);
this.form.days.forEach((item) => {
let times = "";
this.form.time.forEach((val) => {
let hh = val.getHours(); //时
let mm = val.getMinutes(); //分
times += `~${hh}:${mm}`;
});
let beforPush = `${this.changeWeek(item)} ${times.substring(1)}`;
let isOk = this.dynamicTags.every((ishas) => {
console.log(ishas, beforPush);
return ishas != beforPush;
});
console.log(isOk);
if (isOk) {
this.dynamicTags.push(beforPush);
}
});
this.innerVisible = false;
},
changeWeek(data) {
let arr = ["星期一", "星期二", "星期三", "星期四", "星期五"];
return `${arr[data - 1]}`;
},
// 删除时间
handleClose(tag) {
this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
},
},
};
</script>
<style scoped>
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
</style>