我所实现的是当我单击输入字段时显示日历组件,以及当我单击它的外部时隐藏它。然而,问题是当我单击图标(日历组件)本身时,我失去了焦点,如何解决这个问题?我不想在单击图标时失去它的焦点。
const [isFocused, setIsFocused] = useState(false);
<form onSubmit={addTask}>
<div>
<input
id="task"
placeholder=' Add task to "Inbox" on "Tomorrow"'
className={styles.input}
onChange={handleChange}
value={taskName}
onFocus={() => setIsFocused(true)}
onBlur={() => setIsFocused(false)}
></input>
{isFocused && <Calendar/>}
</div>
and this is the Calendar component :
const Calendar = () => {
const [isShown, setIsShown] = useState(false);
const clickIcon = (e) => {
e.preventDefault();
setIsShown((current) => !current);
};
return (
<div>
<CalendarMonthIcon
onClick={clickIcon}
className={styles.calendar}
></CalendarMonthIcon>
{isShown && <Datepicker />}
</div>
);
};
我目前无法阻止日历图标失去焦点时,点击它。
1条答案
按热度按时间guicsvcw1#
你失去了输入的焦点,因为点击图标触发了输入的onBlur函数,因此输入失去了焦点,日历组件被关闭。
通过在onBlur事件中添加以下函数,它应该检查按下的项是否是子元素。如果是,输入应该保持焦点,日历应该保持打开。
**重要提示:**您必须在包含input和calendar的父div上设置onBlur函数,否则该函数将无法工作,因为它会查看单击是否包含子控件。这也是跟踪单击是否在组件之外的好方法。