动态呈现组件时,不应在<router>外使用<route>或withRouter()

时间:2018-08-26 20:12:54

标签: javascript reactjs react-router

  

You should not use <Route> or withRouter() outside a <Router>

在错误输出行上突出显示“ ReactDOM.render ...”。

该错误仅在调用函数ReactDOM.render()

时发生

render()中的呈现组件效果很好。

  --- Parent.js ---
  import Child from './Child';

  export class Parent extends Component {    
        renderComponent() {
            ReactDOM.render(<Child />, 'id').
        }

        render() {  
           return (
              <div>
                  <button onClick={() => this.renderComponent()}/>  // error when clicked 
                  <Child />  // works fine
                  <div id="id"></div>
              </div>
             );
        }    
  }

  --- Child.js ---
  class Child extends Component {          
        render() {  
           return <button onClick={() => this.props.history.push('/')}/>;
        }    
  }
  export default withRouter(Child);

  --- App.js ---   
  export default class App extends Component {
      render() {
          return (
              <BrowserRouter>
                  <Route path="/parent" component={Parent} />
                  <Route exact path="/" component={Home} />
              </BrowserRouter>
          );
      }
  }

1 个答案:

答案 0 :(得分:0)

您不应在已安装的应用程序内调用ReactDom.render()。 Parent中的render方法可以很好地解决这个问题。您应该在RenderComponent()中设置一个状态标志,或者如果您想要一个Child的数组,请将您的组件放在JSX组件数组中,然后将该数组放在render方法中。

标志

export class Parent extends Component {    

    render() {  
       return (
          <div>
              <button onClick={() => this.setState({showChild: true})}/> 
              <Child />  // works fine
              <div id="id"> {this.state.showChild && <Child />} </div>
          </div>
         );
    }    
}