javascript - 如何防止React组件点击事件冒泡到文档?

标签 javascript reactjs click

How to prevent react component click event from bubble up to document ?

我可以确定肯定有什么问题!

所以,也许我应该帮助自己解决这个问题!

我只有一个具有单击事件监听器的框组件,并且该框中有一些受文档单击事件影响的链接组件。如何删除该文档点击事件?

有人可以帮我一个忙吗?

更多详细信息可以在以下链接中找到!

这里是代码链接:https://github.com/ant-design/ant-design/issues/6576

  1. 点击没有效果,它应该链接到item3!

https://user-images.githubusercontent.com/29531779/27420431-6ae3eb5a-5758-11e7-9a36-1af944cd616a.png

  • 删除文档的点击事件
  • https://user-images.githubusercontent.com/29531779/27420435-6c0438fa-5758-11e7-9144-65aca59956cb.png

  • 之后就可以了!
  • https://user-images.githubusercontent.com/29531779/27420561-012899c6-5759-11e7-8376-43c5939148a8.png

    这有什么问题吗?

    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    
    import logo from './logo.svg';
    import './App.css';
    
    // import SideBox from './SideBox.js';
    
    // import ContentBox from './ContentBox.js';
    
    /*import SidebarExample from './test.js';*/
    
    // import ReactDOMServer from 'react-dom/server';
    
    import {
        BrowserRouter as Router,
        Route,
        Link
    } from 'react-router-dom';
    
    import Item1 from './components/Item1.js';
    import Item2 from './components/Item2.js';
    import Item3 from './components/Item3.js';
    
    
    import {Menu, Icon} from 'antd';
    
    import 'antd/dist/antd.css';
    
    const SubMenu = Menu.SubMenu;
    
    
    const element = <h1>Hello, world</h1>;
    
    
    const elements = () => {
        return(
            <h1>Hello, world</h1>
        );
    };
    
    const routes = [
        {
            path: '/',
            exact: true,
            sidebar: () => <div>item1</div>,
            main: () => <div><Item1 /></div>
        },
        {
            path: '/item2',
            sidebar: () => <div>item2</div>,
            main: () => <div><Item2 /></div>
        },
        {
            path: '/item3',
            sidebar: () => <div>item3</div>,
            main: () => <div><Item3 /></div>
        }
    ]
    
    class App extends Component {
        constructor(props) {
            super(props);
            this.state = {
                message: props.message,
                styles: props.styles,
                Any: props.any,
                width: props.width,
                theme: 'dark',
                current: '1'
            };
            this.handleMenuClick = this.handleMenuClick.bind(this);
            this.handleClick = this.handleClick.bind(this);
        };
        handleClick(e) {
            console.log('click ', e);
            this.setState({
                current: e.key,
            });
        };
        // ES7 property initializer syntax
        handleMenuClick = (e) => {
            e.preventDefault();
            // e.stopPropagation();
            // e.nativeEvent.stopImmediatePropagation();
            console.log('this is:', this);
            console.log("clicked === \n", e);
            if(this.state.styles === "App-SideBox-init"){
                this.setState({
                    message: "e.key",
                    styles: "App-SideBox-New",
                    width: "width: 40px;"
                });
            }
            if(this.state.styles === "App-SideBox-New"){
                this.setState({
                    message: "Hello!",
                    styles: "App-SideBox-init",
                    width: "width: 300px;"
                });
            }
            console.log("this.state.message === ", this.state.message);
            console.log("this.state.styles === ", this.state.styles);
        };
        componentDidMount() {
            /*window.addEventListener('scroll', this.onScroll.bind(this), false);*/
            // window.removeEventListener('click', this.handleMenuClick.bind(this), false);
            // window.removeEventListener('click', this.handleClick.bind(this), false);
        };
        render() {
            return (
                <div className="App">
                    <div className="App-header">
                        <img id="img" src={logo} className="App-logo" alt="logo" style={this.props.width}/>
                        <h2>Welcome to React</h2>
                    </div>
                    <div className="App-SideBox">
                        <div className={this.state.styles}>
                            <Router>
                                    <div>
                                        <div style={{ display: 'flex' }}>
                                            <div style={{
                                                    padding: '10px',
                                                    width: '30%',
                                                    background: '#f0f0f0'
                                                }}>
                                                <div className="SideBox-body" style={{ display: 'flex' }}>
                                                    <Menu
                                                            theme={this.state.theme}
                                                            onClick={this.handleClick}
                                                            style={{ width: 240 }}
                                                            defaultOpenKeys={['sub1']}
                                                            selectedKeys={[this.state.current]}
                                                            mode="inline"
                                                        >
                                                        <SubMenu
                                                                key="sub1"
                                                                title={
                                                                    <span>
                                                                        <Icon type="mail" />
                                                                        <span>Navigation One</span>
                                                                    </span>
                                                                }
                                                            >
                                                            <Menu.Item key="1">
                                                                <Link to="/"> item1</Link>
                                                            </Menu.Item>
                                                            <Menu.Item key="2">
                                                                <Link to="/item2">item2</Link>
                                                            </Menu.Item>
                                                            <Menu.Item key="3">
                                                                <Link to="/item3">item3</Link>
                                                            </Menu.Item>
                                                        </SubMenu>
                                                    </Menu>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </Router>
                        </div>
                        {/*onClick={this.handleMenuClick}*/}
                        <div onClick={this.handleMenuClick} className="App-SideBox-btn">
                            <span>icon</span>
                        </div>
                    </div>
                    <div className="App-body">
                        <Router>
                            <div>
                                <div>
                                    <div style={{ flex: 1, padding: '10px' }}>
                                        {
                                            routes.map((route, index) => (
                                                <Route
                                                    key={index}
                                                    path={route.path}
                                                    exact={route.exact}
                                                    component={route.main}
                                                />
                                            ))
                                        }
                                    </div>
                                </div>
                            </div>
                        </Router>
                    </div>
                </div>
            );
        }
    };
    
    App.defaultProps = {
        message: 'Hello!',
        styles: 'App-SideBox-init'
    };
    
    App.propTypes = {
        message: PropTypes.string.isRequired,
        styles: PropTypes.string.isRequired,
        width: PropTypes.string
    };
    
    export default App;

    最佳答案

    只需在父组件上创建所有事件处理程序,然后使用props将它们传递给子组件 !

    关于javascript - 如何防止React组件点击事件冒泡到文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711549/

    相关文章:

    javascript - 将两个数组组合并合并为 Highchart Pie 的数组集

    javascript - 为什么使用完全相同的参数执行 Canvas.getContext ('2d' ).arc 方法会产生不同的结果

    javascript - 将日期和时间转换为当前毫秒 (JavaScript)

    javascript - 动态下拉列表 react axios get 请求

    css - jquery mobile - 添加监听器会破坏 native 点击行为

    javascript - 在 AngularJS 的 ng-repeat 中执行一个函数

    node.js - npm安装错误在解析附近时JSON输入意外结束

    javascript - 如何在不影响 DOM 的情况下使框展开并从原点过渡到屏幕中心?

    javascript - 如何使用javascript通过一个按钮在两种不同颜色之间切换

    jquery - 使用 jQuery 模拟 anchor 点击的浏览器友好方式?