<el-table-column label="预计开始时间" width="180" align="center">
<template slot-scope="cope">
<el-date-picker v-model="cope.row.StartDate"
type="date"
@change="startTimeStatus(cope.row)"
:picker-options="pickerOptionsStart"
value-format="yyyy/MM/dd"
placeholder="选择开始时间">
</el-date-picker>
</template>
</el-table-column>
<el-table-column label="预计完成时间" width="180" align="center">
<template slot-scope="cope">
<el-date-picker v-model="cope.row.EndDate"
type="date"
@change="endTimeStatus(cope.row)"
:picker-options="pickerOptionsEnd"
value-format="yyyy/MM/dd"
placeholder="选择完成时间">
</el-date-picker>
</template>
</el-table-column>
<script>
export default {
data(){
return {
pickerOptionsStart: {
disabledDate: (time) => {
let endDateVal = this.overDate;
if (endDateVal) {
return time.getTime() > new Date(endDateVal).getTime();
}
},
},
pickerOptionsEnd: {
disabledDate: (time) => {
let beginDateVal = this.createDate;
if (beginDateVal) {
return time.getTime() < new Date(beginDateVal).getTime();
}
},
},
overDate: "",
createDate: "",
}
},
methods:{
// 时间开始选择器
startTimeStatus: function (row) {
this.createDate = row.StartDate;
},
// 时间结束选择器
endTimeStatus: function (row) {
this.overDate = row.EndDate;
},
}
}
</script>
我是这样写的,但只能实现一行的,第二行选择开始时间会被第一行结束时间所限制,该怎么改写?
解决了,加个focus跟踪当前行内容就行了
<template>
<el-table-column label="预计开始时间" width="180" align="center">
<template slot-scope="cope">
<el-date-picker v-model="cope.row.StartDate"
type="date"
@change="startTimeStatus(cope.row)"
@focus="focusStartTime(cope.row)"
:picker-options="pickerOptionsStart"
value-format="yyyy/MM/dd"
placeholder="选择开始时间">
</el-date-picker>
</template>
</el-table-column>
<el-table-column label="预计完成时间" width="180" align="center">
<template slot-scope="cope">
<el-date-picker v-model="cope.row.EndDate"
type="date"
@change="endTimeStatus(cope.row)"
@focus="focusEndTime(cope.row)"
:picker-options="pickerOptionsEnd"
value-format="yyyy/MM/dd"
placeholder="选择完成时间">
</el-date-picker>
</template>
</el-table-column>
<template>
export default {
data{
return {
pickerOptionsStart: {
disabledDate: (time) => {
let endDateVal = this.overDate;
if (endDateVal) {
return time.getTime() > new Date(endDateVal).getTime();
}
},
},
pickerOptionsEnd: {
disabledDate: (time) => {
let beginDateVal = this.createDate;
if (beginDateVal) {
return time.getTime() < new Date(beginDateVal).getTime();
}
},
},
overDate: "",
createDate: "",
}
},
methods:{
// 时间开始选择器
startTimeStatus(row){
this.overDate = row.EndDate;
this.createDate = row.StartDate;
},
//获取焦点后,开始/完成时间为当前行的开始/完成时间
focusStartTime(row){
this.overDate = row.EndDate;
this.createDate = row.StartDate;
},
// 时间结束选择器
endTimeStatus(row) {
this.createDate = row.StartDate;
this.overDate = row.EndDate;
},
//获取焦点后,开始/完成时间为当前行的开始/完成时间
focusEndTime(row){
this.overDate = row.EndDate;
this.createDate = row.StartDate;
},
}
}
type="daterange" 不是默认有判断并且两个合成一个组件,你为什么要自己写两个
那第一行选择的时间,会被记录下来吧,可以借助数据来实现,data-picker change事件传当前行下标,然后循环数据当前行下标-1就是上一行,这样就可以了
一对开始结束时间选择要对应一对createDate和overDate
不能整个页面共用
如果开始结束时间必填的话,可以直接用一个选择框加is-range它里面自己有限制结束时间比开始大,
methods:{
// 时间开始选择器
startTimeStatus: function (row) {
var timestamp = parseInt(new Date(row.StartDate).getTime()/1000);
let endDateVal = this.overDate;
if(timestamp<new Date(endDateVal).getTime()){
this.createDate = row.StartDate;
}else{
alert("开始时间不得大于结束时间")
}
},
// 时间结束选择器
endTimeStatus: function (row) {
var timestamp = parseInt(new Date(row.EndDate).getTime()/1000);
let startDateVal = this.startDate;
if(timestamp<new Date(startDateVal).getTime()){
this.overDate = row.EndDate;
}else{
alert("结束时间不得小于开始时间")
}
},
}
}
每次change时,比较新日期的时间戳与另一个选择器时间戳的大小,若满足条件,才更新日期的值。代码没细看,随便改了改可能有bug,主要给你提供个思路,你试试看。