【问题标题】:Is React onClick more like a JavaScript addEventListener than like a standard JavaScript onclick attribute?React onClick 更像是 JavaScript addEventListener 而不是标准的 JavaScript onclick 属性?
【发布时间】:2021-02-10 16:02:09
【问题描述】:

在 React 中,将 onClick 视为设置 eventListener 而不是标准的 JavaScript onclick 属性更好吗?

例如,考虑这两个代码 sn-ps,第一个在标准 JavaScript 中,第二个在 React:

<button onclick="activateLasers()">
  Activate Lasers
</button>

<button onClick={activateLasers}>
  Activate Lasers
</button>

在上面的示例中,onclick 与对 activateLasers 函数的快速调用相关联。但是,在 React 示例中,onClick 只是与 activateLasers 函数相关联(语法并未明确调用该函数,即使在幕后它确实调用了它)。从这个意义上说,尽管 React 的名字叫 onClick,但它更像是这个传统的 JavaScript 代码:

.addEventListener("click", activateLasers)

或者这是错误的思考方式?

【问题讨论】:

  • 请注意,有 HTML 的 onclick 属性和 DOM 的 addEventListener 方法和 React 的 onClick 属性。

标签: javascript reactjs dom-events


【解决方案1】:

差不多是这样的:

// mapEventToComponent implemented by React
document.getElementById("root").addEventListener("click", mapEventToComponent,...);

在 React 中,事件处理程序(如 onClick 处理程序)是 SyntheticEvent instances

它通过使用事件委托来帮助实现高性能。 React 将单个事件侦听器附加到文档的 root(而不是节点本身),当事件调用时,React 将其映射到组件。

自己检查!

const Component = () => {
  return <button onClick={() => console.log("hello")}>Click</button>;
};

  1. 打开开发工具
  2. 触发事件以查看它是否正常工作。
  3. 转到事件监听器选项卡。
  4. 检查所有事件附加到哪个元素。
  5. #root 元素中删除 click 侦听器。

【讨论】:

  • 谢谢!我想我要问的是更基本的。将 React 的 onClick 视为插入 HTML 中的传统 onclick 属性是否有意义。它们看起来几乎相同,但又有所不同。前一个属性采用一个值,该值是对函数的引用。而后一个属性采用一个调用函数的值。对于经验丰富的 React 开发人员来说,这似乎是显而易见的。但不同的是,对于新手来说,这是一个令人困惑的调整。 IMO 最好让 React 调用属性 onClickFuncRef 而不是 onClick。
  • 不知道你期望什么样的答案
  • 再次感谢您的所有反馈。我的问题是一个认知问题:将 React onClick 属性视为标准 html onclick 属性是否有意义?根据反馈,答案似乎是最好不要这样看待它。这是因为与 React onClick 属性关联的值需要是函数的 REFERENCE。相比之下,html onclick 属性需要是对函数的 CALL,如本例所示:jsbin.com/zoxeruy/edit?html,js,console,output
  • 是的,需要作为参考
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 2018-01-11
  • 1970-01-01
  • 2012-04-08
  • 2015-07-30
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多