react-day-picker
是一个流行的 React 日历组件库,允许用户选择日期。当使用自定义输入框时,可能会遇到选择日期后输入框失去焦点的问题。这通常是由于组件内部状态更新导致的重新渲染,从而使得输入框失去焦点。
react-day-picker
提供了丰富的配置选项和自定义能力。问题:当使用 onDayChange
选择一天时,自定义输入框失去焦点。
原因:
key
属性的变化引起的,React 使用 key
来识别组件的身份,如果 key
发生变化,组件会被销毁并重新创建。可以通过以下几种方法解决这个问题:
key
属性固定组件身份确保 react-day-picker
组件的 key
属性保持不变,避免因 key
变化导致的重新渲染。
import React, { useState } from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
function App() {
const [selectedDay, setSelectedDay] = useState(null);
return (
<DayPicker
key={selectedDay ? selectedDay.toString() : 'default'}
onDayClick={day => setSelectedDay(day)}
/>
);
}
export default App;
useRef
保持输入框焦点使用 useRef
钩子来引用输入框,并在日期选择后手动重新聚焦。
import React, { useState, useRef } from 'react';
import DayPickerInput from 'react-day-picker/DayPickerInput';
import 'react-day-picker/lib/style.css';
function App() {
const [selectedDay, setSelectedDay] = useState(null);
const inputRef = useRef(null);
const handleDayChange = (day) => {
setSelectedDay(day);
if (inputRef.current) {
inputRef.current.focus();
}
};
return (
<DayPickerInput
ref={inputRef}
onDayChange={handleDayChange}
value={selectedDay}
/>
);
}
export default App;
通过优化组件结构,减少不必要的重新渲染。
import React, { useState } from 'react';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
function App() {
const [selectedDay, setSelectedDay] = useState(null);
return (
<div>
<input
type="text"
value={selectedDay ? selectedDay.toLocaleDateString() : ''}
readOnly
/>
<DayPicker
selectedDays={selectedDay}
onDayClick={day => setSelectedDay(day)}
/>
</div>
);
}
export default App;
通过固定组件 key
、使用 useRef
手动聚焦或优化组件结构,可以有效解决 react-day-picker
在选择日期后自定义输入框失去焦点的问题。根据具体需求选择合适的方法进行实现。
没有搜到相关的文章