我正在使用 react-date-picker,但在移动设备上,单击时会显示本机键盘,导致日期选择器在顶部打开,这看起来不太好。在线解决方案是将只读属性放在日期选择器绑定的输入字段上。但是 read-date-picker 组件不会让我通过那个道具......
有什么好的解决方案吗?
我正在使用 react-date-picker,但在移动设备上,单击时会显示本机键盘,导致日期选择器在顶部打开,这看起来不太好。在线解决方案是将只读属性放在日期选择器绑定的输入字段上。但是 read-date-picker 组件不会让我通过那个道具......
有什么好的解决方案吗?
这readOnly
是防止浏览器在移动设备上显示键盘和打字的好选择。使用该readonly
集合,您仍然可以在其上启动点击事件。
在谈论react-date-picker模块时,这在非移动设备中也很有用。
可以添加选项readOnly={true}
,但它将完全禁用所有设备上的日期选择器输入,正如我们在以下问题上看到的那样:
此外,您将需要处理该onClick
事件,我认为这不是一个好主意。
目前,在移动设备上禁用键盘并readOnly
为所有 datePickers 输入设置的解决方案将是编辑组件componentDidMount事件的输入属性:
componentDidMount() {
const datePickers = document.getElementsByClassName("react-datepicker__input-container");
Array.from(datePickers).forEach((el => el.childNodes[0].setAttribute("readOnly", true)))
};
使用 React 钩子的可行解决方案
const pickerRef = useRef(null)
useEffect(() => {
if (isMobile && pickerRef.current !== null) {
pickerRef.current.input.readOnly = true;
}
}, [isMobile, pickerRef]);
return (<DatePicker ref={pickerRef} ... />)
所以我最终在 componentDidMount 生命周期中修改了输入元素,就像这样;
document.getElementsByTagName("input")[0].setAttribute("readonly", "readonly");
这会阻止我手机上的本机视觉键盘显示。然而,当悬停输入字段时,它会在桌面上创建这个“不允许”的红色丑陋光标,所以我通过定位我的日期选择器输入来修复它。
.react-datepicker-wrapper input[readonly]{cursor: pointer;}
不过,我欢迎其他解决方案。
<DatePicker
. . . . .
onFocus={(e) => e.target.readOnly = true}
/>
这对我有用。
Caroline Waddell 回答的一个变体让我在 react-datepicker 上畅通无阻2.8.0
。日期选择器元素的date-picker-input
id 在通过 id 获取后修改属性:
componentDidMount() {
document.getElementById('date-picker-input').setAttribute('readonly', 'readonly');
}
如果页面上有多个,对我有用input
。
Reactdatepicker
有 className react-datepicker__input-container
。所以
const datePickers = document.getElementsByClassName(
"react-datepicker__input-container"
);
这将返回一个HTML collection
需要转换为数组的内容。您可以使用Array.from
,但 IE 11 不支持此功能。因此,最好使用 native for loop
。所以
for (let i = 0; i < datePickers.length; i++) {
datePickers[i].childNodes[0].setAttribute("readonly", true);
}
自己打这个。使用一个按钮创建一个自定义输入,该按钮使用所选值的文本打开选择器。
const ReadonlyInput = ({ value, onClick }: any) => (
<button onClick={onClick}>
{value}
</button>
);
return (
<ReactDatePicker
selected={fieldValue}
...
customInput = {<ReadonlyInput />}
/>
)
我使用了类似 onChangeRaw={(e)=>handleDateChangeRaw(e)} 的东西,它允许我禁用键盘类型选项并制作光标指针。
const handleDateChangeRaw = (e:React.FormEvent<HTMLInputElement>) => {
e.preventDefault();
}
<DatePicker
selected={(value && new Date(value)) || null}
onChange={val => { onChange(name, val); }}
dateFormat={ dateFormat }
minDate={new Date()}
timeIntervals={1}
onChangeRaw={(e)=>handleDateChangeRaw(e)}
/>
.react-datepicker__input-container input {
cursor: pointer;
}