【问题标题】:Reactjs - Toggle dropdown menu on click outside anywhere on page instead of just click on the iconReactjs - 在页面上的任意位置单击时切换下拉菜单,而不仅仅是单击图标
【发布时间】:2018-09-07 22:28:55
【问题描述】:

我有一个 React js 应用程序(请不要使用 JQuery)下拉菜单,当单击 ▼ 字符时会触发它。使用下面的代码,下拉菜单只有在再次单击相同的 ▼ 时才会消失。当用户单击页面上的其他任何位置时,我想让它消失。如何更改下面的代码以使下拉菜单在用户单击页面上的其他任何位置时也消失,而不仅仅是单击相同的图标 ▼?

切换器图标:

      <span className="show_more" onClick={this.toggleOptions}>
        <MaterialIcon icon="keyboard_arrow_down" />
      </span>

切换代码:(被许多组件使用,所以只能在这里修复吗?)

import React, { Component } from 'react'
...
import MaterialIcon from '../icons/material-icon'
import HeaderLogo from './logo'

export default class Header extends Component {
  state = {
    showOptions: false,
  }

  toggleOptions = () => this.setState({ showOptions: !this.state.showOptions })

  render() {
    let { showOptions } = this.state

    return (
      <div className="header">
        <div className="row-container container">
          <div className="col-l">
            <HeaderLogo />
          </div>
          <div className="col-m">
            <Search />
          </div>
          <div className="col-r">
            <div className="header_right">
              <HeaderTopLinks />
              <span className="show_more" onClick={this.toggleOptions}>
                <MaterialIcon icon="keyboard_arrow_down" />
              </span>
            </div>

            {showOptions ? (
              <HeaderOptions toggleOptions={this.toggleOptions} />
            ) : null}
          </div>
        </div>
      </div>
    )
  }
}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    The answer can be found here

    但总而言之,你必须监听文档上的点击,并编写一个函数来遍历树并告诉你点击是发生在组件内部还是外部

    以下是该链接中要添加到您的组件中的重要部分:

      handleClickOutside(event) {
        if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {
          alert('You clicked outside of me!');
          this.setState({ showOptions: false });
        }
      }
    
      componentDidMount() {
        document.addEventListener('mousedown', this.handleClickOutside);
      }
    
      componentWillUnmount() {
        document.removeEventListener('mousedown', this.handleClickOutside);
      }
    
      render() {
        let { showOptions } = this.state;
    
        return <div className="header" ref={(node) => this.setWrapperRef = node}>...all the rest of the component goes here...</div>;
      }
    

    为了记录,有很多方法可以做到这一点,这只是一种方法。

    【讨论】:

    • 谢谢,但我认为您的回答非常笼统。我发布了我的组件代码以帮助解答 - 并希望了解如何通过修改切换组件而不是所有调用切换器的组件来完成此操作。
    • 我不明白你的意思。此代码不会修改任何调用切换器的组件。它只是确定用户是否在下拉列表之外点击,这是您寻求帮助的地方。
    • '切换代码(上图)' - 这就是切换下拉菜单的代码。我要求修复可以在该组件中。如果不是,我将不得不修改许多调用此代码的组件。我并不是说您的答案不起作用,但我认为这不会使用我发布的代码。这是一个通用的答案。
    • 不,伙计,您将我提供的代码添加到您的组件中,它将解决您的问题。您不必将其添加到任何其他组件中。
    • 好的,我试试看。当我在退货时丢失了东西时,这段代码在哪里? return &lt;div ref={(node) =&gt; this.setWrapperRef = node}&gt;dropdown stuff&lt;/div&gt;;
    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多