You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

map函数内OnClick事件未触发问题求助

搜索联想列表<li>点击事件不触发的解决办法

问题根源

核心问题是input的onBlur事件优先级比<li>的onClick高:当点击列表项时,浏览器会先触发input的onBlur,将showSuggestions设为false,列表直接被卸载,<li>的点击事件自然无法执行。


方案1:用mousedown替代onClick(推荐)

mousedown事件会在blur之前触发,能确保点击逻辑先执行,再处理状态变化。修改代码如下:

{suggestions.map((s) => (
  <li 
    onMouseDown={() => console.log("hello list")}
    key={s}>
      🔍{s}
  </li>
))}

方案2:给列表添加延迟隐藏逻辑

通过setTimeout让列表延迟隐藏,给点击事件留执行时间:

  1. 先创建一个Ref存储定时器ID:
const blurTimeoutRef = useRef(null);
  1. 修改input的onBlur事件:
onBlur={() => {
  blurTimeoutRef.current = setTimeout(() => setShowSuggestions(false), 100);
}}
  1. 给列表容器添加鼠标进出事件,避免误隐藏:
{showSuggestions && (
  <div 
    onMouseEnter={() => clearTimeout(blurTimeoutRef.current)}
    onMouseLeave={() => setShowSuggestions(false)}
  >
    <ul>
      {suggestions.map((s) => (
        <li 
          onClick={() => console.log("hello list")}
          key={s}>
            🔍{s}
        </li>
      ))}
    </ul>
  </div>
)}
  1. 组件卸载时清除定时器,防止内存泄漏:
useEffect(() => {
  return () => clearTimeout(blurTimeoutRef.current);
}, []);

额外注意事项

  • 确保suggestions数组内元素唯一,避免key值重复引发渲染异常;
  • 如果使用方案2,延迟时间建议控制在100ms以内,避免出现视觉延迟感。

内容的提问来源于stack exchange,提问作者Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:51:02