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

React中如何通过useLongPress的bind对象给onCancel回调传参

解决方案

有两种常用的实现方式可以满足你的需求:


方式1:在列表渲染循环内调用useLongPress(最直接)

你当前将useLongPress放在组件顶层声明,所有按钮共用同一个绑定对象,自然无法传递每个按钮独有的preset参数。把hook调用移到map循环内部,给每个按钮生成专属的绑定配置,就可以通过闭包直接拿到当前遍历的preset:

const Presets = ({presetsList: presets, presetStart: start}) => {
  return (
    <section onContextMenu={(e)=> e.preventDefault()}>
      {presets.map((preset, index) => {
        // 每个按钮单独创建长按/短按回调,通过闭包直接获取当前preset
        const longPress = () => {
          console.log('long click or long press');
          // 其他业务逻辑
        }
        const shortPress = () => {
          console.log('single click or tap');
          start(preset);
        }
        const bind = useLongPress(longPress, {onCancel: shortPress});
        
        return <button 
          key={index} 
          {...bind} 
          type="button" 
        >
          <span>{preset.time}</span>
        </button>
      })}
    </section>
  )
}

export default Presets;

这个方案逻辑直观,只要你的列表长度不会特别大(比如超过上百个),不会有明显性能问题。


方式2:通过元素dataset传递参数(适合列表项多的场景)

如果你不想在循环内调用hook,可以把preset的相关数据存到按钮的自定义数据属性上,在shortPress回调里从事件对象读取:

const Presets = ({presetsList: presets, presetStart: start}) => {
  const longPress = (event) => {
    const preset = JSON.parse(event.target.dataset.preset);
    console.log('long click or long press', preset);
    // 其他业务逻辑
  }

  const shortPress = event => {
    // 从事件目标的dataset读取预设数据
    const preset = JSON.parse(event.target.dataset.preset);
    console.log('single click or tap');
    start(preset);
  }
  
  const bind = useLongPress(longPress, {onCancel: shortPress});
    
  return (
    <section onContextMenu={(e)=> e.preventDefault()}>
      {presets.map((preset, index) => {
        return <button 
                    key={index} 
                    data-preset={JSON.stringify(preset)}
                    {...bind} 
                    type="button" 
                >
                    <span>{preset.time}</span>
                </button>
      })}
    </section>
  )
}

export default Presets;

如果preset存在唯一id,也可以只存id到dataset,回调里再根据id从presets数组查找对应对象,不需要序列化整个对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:15:04