javascript 单击日历组件时该组件失去焦点

eivgtgni  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(208)

我所实现的是当我单击输入字段时显示日历组件,以及当我单击它的外部时隐藏它。然而,问题是当我单击图标(日历组件)本身时,我失去了焦点,如何解决这个问题?我不想在单击图标时失去它的焦点。

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>
  );
};

我目前无法阻止日历图标失去焦点时,点击它。

guicsvcw

guicsvcw1#

你失去了输入的焦点,因为点击图标触发了输入的onBlur函数,因此输入失去了焦点,日历组件被关闭。
通过在onBlur事件中添加以下函数,它应该检查按下的项是否是子元素。如果是,输入应该保持焦点,日历应该保持打开。

**重要提示:**您必须在包含input和calendar的父div上设置onBlur函数,否则该函数将无法工作,因为它会查看单击是否包含子控件。这也是跟踪单击是否在组件之外的好方法。

const closeDropdown = (event) => {
 if (!event.currentTarget.contains(event.relatedTarget)) {
  setIsFocused(false);  
 }
}

相关问题