完全复制:codesandbox link.

我正在try 使用Reaction创建自定义搜索/ Select 组件.我的问题在于事件的执行顺序.

当用户关注文本输入字段时,应该会显示一个带有选项的列表.然后,当用户点击下拉列表中的一项时,元素名称应该填入文本输入字段,然后列表应该隐藏.

我通过创建一个inputFocused布尔状态来实现这一点,并仅在inputFocused为真时呈现列表.我将TWoP事件处理程序附加到文本输入本身:

  • _
  • _

但当用户点击其中一项时,输入不会被填满.

<input
   value={searchTerm}
   onChange={(e) => {
     setSearchTerm(e.target.value);
   }}
   onBlur={() => setInputFocused(false)}
   onFocus={() => setInputFocused(true)}
/>
{inputFocused && (
    <ul>
        <li onClick={() => setSearchTerm(element.name)}>{element.name}</li>
    </ul>
}

请判断codesanbox链接以更好地了解.

我想我明白问题所在.onBlur()事件在onClick()事件之前触发.如果我将onBlur回调函数包装在setTimout中,它将按预期工作:

onBlur={() =>
    setTimeout(() => {
        setInputFocused(false);
    }, 100) 
}

我希望避免定义setTimeout.

有没有解决方案来确保<li>上的onClick()<input />上的onBlur()之前执行?

推荐答案

您可以将列表项上的onClick更改为onMouseDown,浏览器将正确处理排序.

事件按MouseDown-&>MouseUp->;Click的顺序激发(请参见 https://javascript.info/mouse-events-basics#events-order)

Reactjs相关问答推荐

呈现组件元素(MAP)中的问题

在一个地方调用函数会影响其他地方调用该函数

无法使用Apollo客户端GraphQL设置Next.js 14

Next.js-图像组件加载问题

有没有可能在next.js和ssr中使用tsps?

如何通过reactjs正确显示记录

自定义变量默认、聚焦和填充时所需TextField中标签的星号 colored颜色

悬停轴时重新绘制自定义参照线

使用experial_useFormState将参数传递给服务器操作

Github 操作失败:发布 NPM 包

MUI 日期 Select 器 - 最小日期混乱

尽管所有页面在 Reactjs 中都是公开的,但始终导航到特定页面

如何使用 App Router 和服务器组件在 Next.js 13 中实现分页

BrowserRouter改变了URL但没有链接到页面

Material UI @mui/material/Button vs @material-ui/core/Button,它什么时候改变的,旧版本的文档在哪里

无法读取未定义的属性(读取值)...TypeError:无法读取未定义的属性(读取值)

如何读取 null 的属性?

Select 建议后如何关闭 vscode 添加自动完成={}

material uireact ,如何从表格中删除阴影?试图找到 api 但找不到正确的属性

在 React 中访问作为 prop 传递的状态变量