javascript - 为什么 React 类中的 'this' 与 Js 事件处理程序中的不同?

标签 javascript reactjs

当我使用此代码时:

html :  <body>
   <button>Click me</button>
   <script type="module" src="1.js"></script>
 </body>
JS : const btn = document.querySelector('button')
class Events {
 constructor() {
   console.log(this)
   btn.addEventListener('click', this.handleClick)
 }
 handleClick() {
   console.log(this)
 }
}
const event = new Events()

“this”=按钮元素

但是当我在 react 中使用这段代码时:

class Event extends Component {
  constructor(props) {
    super(props)

    this.state = {}
  }
  handleClick() {
    console.log(this)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>Click me</button>
      </div>
    )
  }
}

“这个”=未定义 为什么 javascript 事件处理程序中的“this”与 React 事件处理程序不同?

最佳答案

因为 React 的合成事件系统不会在将 this 设置为 DOM 元素的情况下调用您的函数,而 DOM 会这样做。这就是 React 事件处理的编写方式。它只是执行yourHandler(eventObject),而不是yourHandler.call(theDOMElement, eventObject)。您可以阅读更多相关信息here 。如果要访问 DOM 元素,请使用事件对象的 currentTarget 属性:

handleClick(event) {
    const element = event.currentTarget;
    // ...
}

这与 DOM 用于 this 的元素相同(并且既是 DOM 属性又是 React 属性)。请注意,currentTargettarget 不是同一件事; target 可能是您 Hook 事件的元素的元素,但 currentTarget 将始终是您 Hook 事件的元素。

下一个问题可能是您对此采取的措施。已涵盖herehere .

关于javascript - 为什么 React 类中的 'this' 与 Js 事件处理程序中的不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67032928/

相关文章:

javascript - rails : Include Javascript_include_tag outside default folders

php - 类似CTRL+F功能的搜索框

javascript - 从 child 更改 parent 的状态时,为什么 parent 不再渲染?

css - 在 React 的嵌套 map 上使用 CSS nth-child

JavaScript 语法错误(限制小数点后 2 位)

javascript - 如何在浏览器的地址栏中附加 Accordion 的标题 ID 作为 anchor URL?

javascript - 覆盖 Enter 键的 SELECT 行为

javascript - 每个按钮的单击处理程序错误地返回一组按钮的最后一个按钮

javascript - Push 不是一个函数,Redux

javascript - 不断收到 TypeError : guide. map is not a function