javascript - Gatsby 功能组件事件处理传递 'this'

标签 javascript reactjs ecmascript-6 gatsby

使用Gatsby/React功能组件,如何通过this到事件处理程序?我需要管理<figure>的css类通过“classList”。

import React from 'react'

const Hamburger = props => {
  const clickHandler = () => {
    this.classList.toggle('open')
  }
  return (
    <figure className="hamburger open" onClick={clickHandler.bind(this)}>
      <i>menu</i>
    </figure>
  )
}

export default Hamburger

最佳答案

这里有两个问题:

  • 箭头函数没有自己的 this,因此浏览器实际上无法将点击处理程序的 this 设置到元素。
  • 但更大的问题是,在使用 React 时不应该直接更改 DOM。

使用 React 执行此操作的方法是通过状态跟踪组件是否打开(在本例中为 useState hook ),并相应地设置类列表:

import React from 'react'

const {useState} = React;

export default const Hamburger = props => {
  const [open, setOpen] = useState(true);

  const clickHandler = () => {
    setOpen(!open);
  };

  return (
    <figure className={'hamburger' + (open ? ' open' : '')} onClick={clickHandler}>
      <i>menu</i>
    </figure>
  )
}

export default Hamburger

关于javascript - Gatsby 功能组件事件处理传递 'this',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929748/

相关文章:

javascript - 在 JS 上公开子模块(import * from ...)是不好的做法吗?

javascript - 使用 js jQuery 的 Rails 3.1 错误 - "Template is missing"

javascript - 如何检测用户是否删除了输入框中的文本

javascript - React : Warning: validateDOMNesting(. ..): 文本节点不能作为 <tbody> 的子节点出现

javascript - 扩展错误没有消息或堆栈跟踪

javascript - 如何在 Safari 中使用箭头函数运行 ES6 代码?

javascript - 在 IE8 中设置单选按钮和复选框的样式

javascript - 如何仅替换匹配的正则表达式的第一个字符?

meteor - 警告 : Each child in an array or iterator should have a unique "key" prop. 检查 `SocialMenu` 的渲染方法。 (Meteor.js 应用程序中的 React.js)

javascript - 使用 Email.js 发送邮件所需的用户 ID