Material-UI 选择器在模糊而不是更改时触发验证?
Material-UI pickers trigger validation on blur not on change?
只要您开始在 DatePicker 组件中键入内容,就会触发验证。
使用
时,如何在 blur 而不是 onInputChange 上触发验证
@material-ui/pickers
意味着 material-ui v4
将值传递给模糊函数应该可以工作并忽略更改,但是一旦您删除 onChange 事件,代码就会中断。
例子
export default function MaterialUIPickers() {
const [selectedDate, setSelectedDate] = React.useState();
const handleDateChange = (date) => {
setSelectedDate(date);
};
const handleBlur = (e) => {
setSelectedDate(e.target.value);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<KeyboardDatePicker
id="date-picker-dialog"
format="MM/dd/yyyy"
value={selectedDate}
onChange={handleDateChange}
onBlur={handleBlur}
/>
</MuiPickersUtilsProvider>
);
}
根据 documentation,onChange
是必需的。但是,您不需要在 onChange
中设置 value
。如果您在该函数中省略 setSelectedDate
而仅在 onBlur
中执行此操作,则日期设置和验证将仅在 blur
事件中发生。
export default function MaterialUIPickers() {
const [selectedDate, setSelectedDate] = React.useState();
const [wasOpened, setWasOpened] = React.useState();
const handleDateChange = (date) => {
if (wasOpened)
{
setSelectedDate(date);
}
};
const handleBlur = (e) => {
setSelectedDate(e.target.value);
};
const handleOnOpen = () => {
setWasOpened(true);
};
const handleOnClose = () => {
setWasOpened(false);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<KeyboardDatePicker
id="date-picker-dialog"
variant="inline"
format="MM/dd/yyyy"
value={selectedDate}
onChange={handleDateChange}
onBlur={handleBlur}
autoOk={true}
onOpen={handleOnOpen}
onClose={handleOnClose}
/>
</MuiPickersUtilsProvider>
);
}
由于 onChange
是强制性的,在回调中返回 undefined
解决了问题,但破坏了 datePicker select 选项(不将 selected 日期应用于输入场)。
由于上述原因,应该使用 onAccept
,从而可以省略内部状态逻辑,这是至关重要的。
代码
export default function MaterialUIPickers() {
const [selectedDate, setSelectedDate] = React.useState();
const handleBlur = (e) => {
setSelectedDate(e.target.value);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<KeyboardDatePicker
id="date-picker-dialog"
format="MM/dd/yyyy"
value={selectedDate}
onChange={()=>undefined}
onAccept{setSelectedDate}
onBlur={handleBlur}
/>
</MuiPickersUtilsProvider>
);
}
只要您开始在 DatePicker 组件中键入内容,就会触发验证。
使用
时,如何在 blur 而不是 onInputChange 上触发验证@material-ui/pickers
意味着 material-ui v4
将值传递给模糊函数应该可以工作并忽略更改,但是一旦您删除 onChange 事件,代码就会中断。
例子
export default function MaterialUIPickers() {
const [selectedDate, setSelectedDate] = React.useState();
const handleDateChange = (date) => {
setSelectedDate(date);
};
const handleBlur = (e) => {
setSelectedDate(e.target.value);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<KeyboardDatePicker
id="date-picker-dialog"
format="MM/dd/yyyy"
value={selectedDate}
onChange={handleDateChange}
onBlur={handleBlur}
/>
</MuiPickersUtilsProvider>
);
}
根据 documentation,onChange
是必需的。但是,您不需要在 onChange
中设置 value
。如果您在该函数中省略 setSelectedDate
而仅在 onBlur
中执行此操作,则日期设置和验证将仅在 blur
事件中发生。
export default function MaterialUIPickers() {
const [selectedDate, setSelectedDate] = React.useState();
const [wasOpened, setWasOpened] = React.useState();
const handleDateChange = (date) => {
if (wasOpened)
{
setSelectedDate(date);
}
};
const handleBlur = (e) => {
setSelectedDate(e.target.value);
};
const handleOnOpen = () => {
setWasOpened(true);
};
const handleOnClose = () => {
setWasOpened(false);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<KeyboardDatePicker
id="date-picker-dialog"
variant="inline"
format="MM/dd/yyyy"
value={selectedDate}
onChange={handleDateChange}
onBlur={handleBlur}
autoOk={true}
onOpen={handleOnOpen}
onClose={handleOnClose}
/>
</MuiPickersUtilsProvider>
);
}
由于 onChange
是强制性的,在回调中返回 undefined
解决了问题,但破坏了 datePicker select 选项(不将 selected 日期应用于输入场)。
由于上述原因,应该使用 onAccept
,从而可以省略内部状态逻辑,这是至关重要的。
代码
export default function MaterialUIPickers() {
const [selectedDate, setSelectedDate] = React.useState();
const handleBlur = (e) => {
setSelectedDate(e.target.value);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils}>
<KeyboardDatePicker
id="date-picker-dialog"
format="MM/dd/yyyy"
value={selectedDate}
onChange={()=>undefined}
onAccept{setSelectedDate}
onBlur={handleBlur}
/>
</MuiPickersUtilsProvider>
);
}