代码之家  ›  专栏  ›  技术社区  ›  Ben Swindells

边栏DOM与导航栏重叠,将其从DOM中删除

  •  2
  • Ben Swindells  · 技术社区  · 7 年前

    var app = document.getElementById('app');
    
    class Navbar extends React.Component {
        constructor(props) {
            super(props);
            this.state = { 
                sidebarOn: false
            };
            this.onClickOpen = this.onClickOpen.bind(this);
        }
        
        onClickOpen(open) {
            console.log(open);
            if(open) {
                this.setState({sidebarOn: open});
                Menu();
            }
            
        }
        render() {
            return(
                <div>
                <header>    
                <nav class="navbar navbar-custom sticky-top">
                    <a class="navbar-brand" href="#">TO DO LIST</a>
                    <a class="burger-menu" href="#"><img src='/images/hamburger-icon.png' onClick={() => this.onClickOpen(true)}></img></a>
                </nav>
                </header>
            </div>
            );
        }
    }
    
    
    
    function Menu() {
        class Parent extends React.Component {
            constructor() {
                super();
                this.state = {
                    burgerOn: "burger-right"
                };
            }
          render() {
            return (
                <div class={this.state.burgerOn}>
                          <div class="container">
                    <form >
                        <div class="form-group task-title">
                        <label for="title">
                            Task Title
                        </label>
                        <input type="title" class="form-control" placeholder="Enter Task Title"></input>
                        </div>
                        <div class="form-group task-desc">
                            <label for="desc">Task Description</label>
                            <textarea type="text" class="form-control" id="desc" placeholder="Enter Task Description" rows="5"></textarea>
                        </div>
                    </form>
                    <div>
                    <button type="button" class=" task-btn btn btn-primary">Create</button>
                    </div>
                    </div>
                </div>
            );
          } 
        }
        ReactDOM.render(<Parent />, app);
    }
    
    ReactDOM.render(<Navbar />, app);
    var app = document.getElementById('app');
    
    class Navbar extends React.Component {
        constructor(props) {
            super(props);
            this.state = { 
                sidebarOn: false
            };
            this.onClickOpen = this.onClickOpen.bind(this);
        }
        
        onClickOpen(open) {
            console.log(open);
            if(open) {
                this.setState({sidebarOn: open});
                Menu();
            }
            
        }
        render() {
            return(
                <div>
                <header>    
                <nav class="navbar navbar-custom sticky-top">
                    <a class="navbar-brand" href="#">TO DO LIST</a>
                    <a class="burger-menu" href="#"><img src='/images/hamburger-icon.png' onClick={() => this.onClickOpen(true)}></img></a>
                </nav>
                </header>
            </div>
            );
        }
    }
    
    
    
    function Menu() {
        class Parent extends React.Component {
            constructor() {
                super();
                this.state = {
                    burgerOn: "burger-right"
                };
            }
          render() {
            return (
                <div class={this.state.burgerOn}>
                          <div class="container">
                    <form >
                        <div class="form-group task-title">
                        <label for="title">
                            Task Title
                        </label>
                        <input type="title" class="form-control" placeholder="Enter Task Title"></input>
                        </div>
                        <div class="form-group task-desc">
                            <label for="desc">Task Description</label>
                            <textarea type="text" class="form-control" id="desc" placeholder="Enter Task Description" rows="5"></textarea>
                        </div>
                    </form>
                    <div>
                    <button type="button" class=" task-btn btn btn-primary">Create</button>
                    </div>
                    </div>
                </div>
            );
          } 
        }
        ReactDOM.render(<Parent />, app);
    }
    
    ReactDOM.render(<Navbar />, app);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react-dom.min.js"></script>
    <!DOCTYPE html>
    <html>
    <head> 
            <script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
            <script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
            <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    </head>
    <body>   
            <div id="app"></div>
            <script type="text/babel" src="/js/app.js"></script>    
    </body>
    </html>

    enter image description here

    enter image description here

    如截图所示,如果单击断开的图像链接,我的表单将覆盖todolist导航栏。

    非常感谢您的建设性帮助:)

    2 回复  |  直到 7 年前
        1
  •  1
  •   amdev    7 年前

    问题是,当您想要呈现侧边栏菜单时,您正在使用以下代码

    ReactDOM.render(<Parent />, app);
    

    这意味着只需插入组件的内部 app html文件中的元素。其结果类似于擦除先前渲染的组件,然后渲染新组件。这就是你在这里看到的:

    ...some code
              } 
            }
            ReactDOM.render(<Parent />, app); <---- here
        }
    
        ReactDOM.render(<Navbar />, app); <---- and here
    
    ... morecode
    

    您不需要直接渲染您刚刚在根元素内部创建的每个组件。 所有其他组件都应该嵌套在父组件中,这样您只需渲染 单亲成分 html文件中根元素的内部以及所有其他组件将通过在父组件中导入并在父组件中使用它们而包含在其中,如下所示:

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    import B from './B'
    
    class A extends React.component {
       render() {
         return(
           <div>
             <B />
           </div>
         )
       }
    }
    
    
    ReactDOM.render(
      <A />,
      document.querySelector('#app')
    )
    
        2
  •  0
  •   Ben Swindells    7 年前

    我能够通过一个_m_dev的帮助解决我的问题,然后添加了一个条件语句来检查类是否打开,如下所示:

            class App extends React.Component {
            render() {
                return(
                    <div>
                        <Navbar/>
                    </div>
                );
            }
        }
    
    
        class Navbar extends React.Component {
            constructor() {
                super();
                this.state = {
                    burgerOn: false
                }
            }
            clickHandler(open) {
                this.setState({burgerOn: open});
            }
            render() {
                return(
                    <div>
                    <header>    
                    <nav class="navbar navbar-custom sticky-top">
                        <a class="navbar-brand" href="#">TO DO LIST</a>
                        <a class="burger-menu" href="#"><img src='/images/hamburger-icon.png' onClick={() => this.clickHandler(true)}></img></a>
                    </nav>
                    </header>
                    <div>
                        {this.state.burgerOn ? <Parent/> : null}
                    </div>
                </div>
    
                );
            }
        }
    
        class Parent extends React.Component {
    
            constructor() {
                super();
                this.state = {
                    burgerOn: "burger-right"
                };
            }
            render() {
            return (
                <div class={this.state.burgerOn}>
                          <div class="container">
                    <form >
                        <div class="form-group task-title">
                        <label for="title">
                            Task Title
                        </label>
                        <input type="title" class="form-control" placeholder="Enter Task Title"></input>
                        </div>
                        <div class="form-group task-desc">
                            <label for="desc">Task Description</label>
                            <textarea type="text" class="form-control" id="desc" placeholder="Enter Task Description" rows="5"></textarea>
                        </div>
                    </form>
                    <div>
                    <button type="button" class=" task-btn btn btn-primary">Create</button>
                    </div>
                    </div>
                </div>
            );
          }
        }
    
    
    
    
    ReactDOM.render(<App/>, app);
    

    我希望这能帮助有同样问题的人:)