https://codesandbox.io/s/timepicker-8mo3x?file=/src/App.js
好的,我想我明白了;可能会进一步重构,尽管它有效:
import React, { useState, useEffect } from "react";
import "./styles.css";
import { TimePicker } from "antd";
import "antd/dist/antd.css";
import moment from "moment";
const HHmm = "HH:mm";
export default function App() {
const [time,setTime] = useState({
start: "",
end: "",
duration: ""
})
const onStartChange = value => {
if(time.start && time.end && time.duration) {
const diffHours = value.diff(time.end, "hours");
const diffMinutes = moment
.utc(moment(value, HHmm).diff(moment(time.end, HHmm)))
.format("mm");
setTime((time)=>({
start: value,
end: time.end,
duration: moment(`${diffHours} : ${diffMinutes}`, HHmm)
}));
} else {
setTime((time)=>({
start: value,
end: time.end,
duration: time.duration
}))
}
};
const onDurationChange = value => {
if(time.start && time.end && time.duration) {
const endToStartTime = moment(time.start)
.add(value.hours(), "h")
.add(value.minutes(), "m");
setTime((time)=>({
start: time.start,
end: endToStartTime,
duration: value
}));
} else {
setTime((time)=>({
start: time.start,
end: time.end,
duration: value
}))
}
};
const onEndChange = value => {
if(time.start && time.end && time.duration) {
const diffHours = value.diff(time.start, "hours");
const diffMinutes = moment
.utc(moment(value, HHmm).diff(moment(time.start, HHmm)))
.format("mm");
setTime((time)=>({
start: time.start,
end: value,
duration: moment(`${diffHours} : ${diffMinutes}`, HHmm)
}));
} else {
setTime((time)=>({
start: time.start,
end: value,
duration: time.duration
}))
}
};
useEffect(()=>{
if(time.start && time.end && !time.duration) {
const diffHours = time.end.diff(time.start, "hours");
const diffMinutes = moment
.utc(moment(time.end, HHmm).diff(moment(time.start, HHmm)))
.format("mm");
setTime((time)=>({
start: time.start,
end: time.end,
duration: moment(`${diffHours} : ${diffMinutes}`, HHmm)
}));
}
if(time.start && !time.end && time.duration) {
const endToStartTime = moment(time.start)
.add(time.duration.hours(), "h")
.add(time.duration.minutes(), "m");
setTime((time)=>({
start: time.start,
end: endToStartTime,
duration: time.duration
}));
}
if(!time.start && time.end && time.duration) {
const startToEndTime= moment(time.end)
.subtract(time.duration.hours(), "h")
.subtract(time.duration.minutes(), "m");
setTime((time)=>({
start: startToEndTime,
end: time.end,
duration: time.duration
}));
}
},[time])
return (
<div className="App">
<span>Start: </span>
<TimePicker value={time.start} onChange={onStartChange} format={HHmm} />
<span>Duration: </span>
<TimePicker value={time.duration} onChange={onDurationChange} format={HHmm} />
<span>End: </span>
<TimePicker value={time.end} onChange={onEndChange} format={HHmm} />
</div>
);
}