【问题标题】:Using `addEventListener` to add click event to icon within React component使用`addEventListener`将点击事件添加到React组件中的图标
【发布时间】:2021-04-26 01:28:49
【问题描述】:

我正在尝试将事件侦听器添加到我的 React 应用程序中的图标,以便我可以在单击该图标时触发一个函数(单击周围的 TextField 是不够的)。我需要手动执行此操作,因为 fluentui-react 元素上没有 click 属性。

到目前为止,虽然我可以根据我的 console.log 看到已选择了正确的 DOM 元素,但当我单击该图标时,什么也没有发生。

我在componentDidUpdate() 处理这个问题,像这样:

  componentDidUpdate() {
    const node = ReactDOM.findDOMNode(this);
    if (this.props.sessionsWithNotes.length) {
      if (node instanceof HTMLElement) {
        const child = node.querySelector('i');
        console.log('child: ', child); // I see this in the console
        child.addEventListener('click', () => console.log("Clear icon clicked!")); // This does not print to the console upon click of the icon
      }
    }
  }

需要明确的是,我正在登录到控制台的 child 显示如下:

<i data-icon-name="clear" aria-hidden="true" class="icon-167"></i>

所以这是正确的图标元素。但是,当我在控制台中看到它显示后单击它时,什么也没有发生 - 即我的 console.log 中的“Clear icon clicked!”不会打印到控制台。

注意,使用 react-fluent-ui 的相关 JSX 块如下所示:

  <TextField
    label="ID:"
    defaultValue={this.props.filters.id}
    onChange={this.onFilterById}
    styles={{ root: { maxWidth: 300 } }}
    borderless
    underlined
    iconProps={iconProps}
  />

iconProps 看起来像这样:

const iconProps = {
  iconName: 'clear',
  cursor: 'pointer',
};

我在这里错过了什么?

【问题讨论】:

  • 请问为什么不能直接访问元素?请分享组件的完整细节。
  • fluentui-react 定义的iconProps 上没有click 属性,并且点击事件需要在图标本身上,而不是在它所属的TextField 上。所以我需要手动定义它。如果我误解了你,请告诉我。
  • 这太奇怪了,我应该看看文档!
  • 我有,其他人也有。当 iconProps 包含在 TextField 中时,没有 click 属性。
  • 我为测试做了codeandbox,你的cursor: 'pointer'有效吗?

标签: reactjs fluentui-react


【解决方案1】:

好像他们禁用了 TextField 下图标的指针事件

https://github.com/microsoft/fluentui/blob/master/packages/react-internal/src/components/TextField/TextField.styles.tsx

我假设您可以通过向 iconProps 提供内联样式并将指针事件设置为“auto”来覆盖此行为,然后像往常一样传递 onClick,它看起来像这样:

<TextField iconProps={style: {pointerEvents: 'auto'}, onClick: () => {..}} />

【讨论】:

  • 这是一种直接访问点击事件的方法,很好。我告诉过你这很奇怪!
  • @b3hr4d,我猜它可以工作,因为你覆盖了iconProps 的默认行为。默认情况下,他们可以在其上定义click,但他们没有。但是您可以按照上面的@Eyal 建议覆盖默认道具。
  • 感谢 Eyal 和 Muirik,我今天学到了一些新东西。但我认为另一种方式可以是这里提到的拆分developer.microsoft.com/en-us/fluentui#/controls/web/button
  • @b3hr4d,当左侧是输入字段时,split 按钮会起作用吗 - 就像这里的情况一样?我有疑问。我认为split 是指具有两个不同click 事件的按钮。
  • 最终解决方案,应用所需的指针样式:` iconProps={{ style: { pointerEvents: 'auto', cursor: 'pointer' }, iconName: 'clear', onClick: () = > { this.clearTextField() }}}`
猜你喜欢
  • 2013-04-10
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多