如何从React组件中向BODY添加单击处理程序?

Tim*_*Tim 16 javascript jquery reactjs

我正在构建一个下拉菜单React组件,当用户单击组件外部的DOM 中的任何位置时,该组件应该关闭.

使用jQuery我通常会body在打开下拉菜单时添加一个事件监听器,并在下拉菜单关闭时再次将其删除.(事件监听器本身关闭下拉-任何点击事件,该成分不会传播到防止身体单击处理烧制而成)

有没有办法body从React组件中将侦听器附加到元素?或者我应该只使用jQuery?(我有点担心混合使用React和jQuery.)

Hen*_*son 26

React只是JavaScript,因此通过使用将点击处理程序附加到任何元素是正常的addEventListener().通过删除添加的事件处理程序,执行此componentDidMount操作通常非常好,整洁和清理componentWillUnmount.

var Component = React.createClass({
    componentDidMount: function () {
        document.body.addEventListener('click', this.myHandler);
    },
    componentWillUnmount: function () {
        document.body.removeEventListener('click', this.myHandler);
    },
    myHandler: function () {
        alert('click');
    },
    render: function() {
        return <div>Hello {this.props.name}</div>;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 好.像宣传的那样工作.唯一(新)问题是在DOM元素上停止JS中的传播还会阻止在子元素中触发React事件,这些事件应首先接收事件.由于React事件是从`document`委派的.http://stackoverflow.com/a/24421834/698511 (4认同)

Jay*_*era 8

使用基于函数的组件是有帮助的:

import React, { useEffect  } from 'react';

const ZSideBar = (props) => {

    useEffect(() => {
        document.body.addEventListener('click', closeSidemenu );

        return function cleanup() {
            window.removeEventListener('click', closeSidemenu );
        } 
    },[]);
    let closeSidemenu = () => {
        document.getElementById("sidebar-tree").style.left = "-310px";
    }
   
    return (
        <div></div>
    )

}
Run Code Online (Sandbox Code Playgroud)