javascript - ReactJS,event.currentTarget 没有与 Vanilla Javascript 相同的行为

标签 javascript reactjs

我想知道 ReactJS 中是否存在类似 event.currentTarget 的东西,使用 event.target onclick 的问题是我得到了 childDiv而不是 parentDiv

普通 Javascript 示例:

document.getElementById("parentDiv").onclick = function() {
    console.log(event.currentTarget.id); // or this.id
    console.log(event.target.id);
};
<div id="parentDiv">Parent (click me)
    <div id="childDiv">Child (then click me)</div>   
</div>

ReactJS,(在无状态函数中):

...
const myFunction = (event) => {  
    event.stopPropagation(); // Doesn't make a difference.
    console.log(event.target); // Not trying to get the child element
    console.log(this); // 'this' is undefined
    console.log(event.currentTarget); // Gets the '#document' element
};
...
<div onClick={() => myFunction(event)}>...</div>
...

我敢肯定对于这个基本的东西有多种解决方案,我很惊讶我找不到讨论这个的线程。有什么建议吗?

最佳答案

首先你实际上并没有通过 event ,不确定这是否是错字,但应该是错误的。

这个:

onClick={() => myFunction(event)}>...</div>

应该这样写:

onClick={(event) => myFunction(event)}>...</div>

其次,不需要传递一个新的函数,只需要传递对已经存在的函数的引用myFunction .

<div onClick={myFunction}>

如您在以下代码片段中所见,代码按预期运行:

它将打印:

<div>click me</div>
undefined
<div>click me</div>

请注意父级的第二个处理程序 div没有被触发,这证明event.stopPropagation()正在工作。

至于为什么this未定义是因为您可能运行 strict mode 中的代码(或在默认情况下位于 strict mode 中的模块内)并且 React 将为您运行处理程序,这不是合成的原生 DOM 事件。
所以基本上运行这样的功能:

myFunc()

将设置 this到窗口(或在严格模式下为 undefined)

这是我做的图表,也许它可以帮助你 enter image description here

function App() {
  const myFunction = event => {
    event.stopPropagation(); // works as expected
    console.log(event.target); // Gets <div>click me</div>
    console.log(this); // 'this' is undefined
    console.log(event.currentTarget); // Gets <div>click me</div>
  };
  const myFunc2 = e => {
    console.log("myFunc2");
  };
  return (
    <div onClick={myFunc2}>
      <div onClick={myFunction}>click me</div>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />

关于javascript - ReactJS,event.currentTarget 没有与 Vanilla Javascript 相同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090122/

相关文章:

javascript - 如何在 React 执行时禁用点击事件?

javascript - 如何检查应用程序是否在 Reactjs 应用程序的另一个选项卡中打开

javascript - Three.js 使用2D texture\sprite做动画(planeGeometry)

javascript - 忽略溢出 :auto element 中的元素

javascript - 如何以 Angular 查找给定数组列表的所有行中是否存在相同的值

javascript - Lodash .clone 和 .cloneDeep 行为

Javascript 参数作为未定义传递

reactjs - 在 React 组件之外访问 redux 存储的最佳方法是什么?

reactjs - React 组件中的 onDeviceReady 事件监听器

javascript - Require 不是使用带有 babel 和 webpack 的 ReactJs 定义的