javascript 在React中覆盖onClick

9fkzdhlc  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(194)

这是一个有点奇怪的问题。我在React中处理事件类型,我们希望在某些示例中使用onClick,而在其他示例中使用onPointerDownCapture(出于某些原因)。但是为了使其更通用,它可以是任意两个不同的类似于点击的事件。问题是,尽管我们可以在表达式的右侧分配任何函数处理程序,但左侧本质上必须是静态的。因此,
〈按钮onClick={handler}对比onPointerDownCapture={handler}对比onMouseDown={handler}/〉
我认为仅仅使用onPointerDownCapture对于大多数用例来说是可以的,但是在一个完美的世界里,我可以在运行时基于其他变量在这些变量之间切换。有没有可能覆盖按钮/div/上的onClick原型或者其他东西,使其成为我想要的任何事件类型?
搜索了很多。都没成功。

qvtsj1bj

qvtsj1bj1#

我不完全理解您所说的“覆盖onClick”是什么意思,但是
问题是,尽管我们可以在表达式的右侧分配任何函数处理程序,但左侧必须是静态的。
这是不正确的,左手边可能是动态的,下面是如何:

<button {...({ [eventName]: handler })} />

我想这解决了你的问题。
好吧,上面的语法有点简洁,而且确实令人困惑。这是一个很好的老JSX spread props语法,只是在一个内联对象文字上。
我会给予你另一个等价的形式,希望它应该更具可读性。

const eventName = someCondition ? "onPointerDownCapture" : "onClick"

const props = { 
  [eventName]: handler
}

<button {...props} />
disbfnqx

disbfnqx2#

必须使用这些属性名,并且对所有3个属性使用相同的函数名。
这3个属性的作用是注册相关事件。
也许您可以使用useEffect,并有条件地在其中添加一个事件侦听器,而不是建议的React属性。

bsxbgnwa

bsxbgnwa3#

我认为最好是在注解中使用@vera解决方案。将额外的prop传递给组件(例如isOnClick),并基于此将callback或undefined传递给事件处理程序prop:

function Component(props: { isOnClick: boolean; callback: () => void }) {
  return (
    <div
      onClick={props.isOnClick ? props.callback : undefined}
      onMouseDown={props.isOnClick ? undefined : props.callback}
    />
  );
}

注意,将undefined传递给prop与不设置该prop是一样的。
或者有条件地返回组件:

function Component(props: { isOnClick: boolean; callback: () => void }) {
  if (props.isOnClick) {
    return <div onClick={props.callback}/>
  } else {
    return <div onMouseDown={props.callback}/>
  };
}

相关问题