【问题标题】:React-Router only one childReact-Router 只有一个孩子
【发布时间】:2017-08-17 00:04:14
【问题描述】:

我不断收到错误:

“路由器”可能只有一个子元素

使用 react-router 时。

我似乎无法弄清楚为什么这不起作用,因为它与他们在示例中显示的代码完全相同:Quick Start

这是我的代码:

import React from 'react';
import Editorstore from './Editorstore';
import App from './components/editor/App';
import BaseLayer from './components/baselayer';
import {BrowserRouter as Router, Route} from 'react-router-dom';
import {render} from 'react-dom';

const root = document.createElement('div');
root.id = 'app';
document.body.appendChild(root);

const store = new Editorstore();
const stylelist = ['https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css', 'https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.2/semantic.min.css', 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css', 'https://api.tiles.mapbox.com/mapbox-gl-js/v0.33.1/mapbox-gl.css'];

stylelist.map((link) => {
    const a = document.createElement('link');
    a.rel = 'stylesheet';
    a.href = link;
    document.body.appendChild(a);
    return null;
});

render((
  <Router>
    <Route exact  path="/" component={BaseLayer} />
    <Route path="/editor" component={App} store={store} />
  </Router>
), document.querySelector('#app'));

【问题讨论】:

  • BrowserRouter 中的东西(Link, Route)需要包裹在div

标签: javascript reactjs react-router


【解决方案1】:

您必须将您的Route 包装在&lt;div&gt;(或&lt;Switch&gt;)中。

render((
  <Router>
    <Route exact  path="/" component={BaseLayer} />
    <Route path="/editor" component={App} store={store} />
  </Router>
), document.querySelector('#app'));

应该是

render((
  <Router>
    <div>
       <Route exact  path="/" component={BaseLayer} />
       <Route path="/editor" component={App} store={store} />
    </div>
  </Router>
), document.querySelector('#app'));

jsfiddle/webpackbin

【讨论】:

  • 奇怪。这是为什么呢?
  • Router 期望 this.props.childrennull 或长度等于 1
  • 这不起作用,它只是在同一个地方显示两条路线。
  • 它显示两条路线,因为它使用div,你真的应该使用switch。这使得路线独家github.com/ReactTraining/react-router/blob/master/packages/…
  • 有一个组件可以做这个包装:Switch
【解决方案2】:

这是 react-router 4.x 中的 API 更改。推荐的方法是将Routes 包裹在Switch: https://github.com/ReactTraining/react-router/issues/4131#issuecomment-274171357

引用:

转换

<Router>
  <Route ...>
  <Route ...>
</Router>

<Router>
  <Switch>
    <Route ...>
    <Route ...>
  </Switch>
</Router>

当然,您需要将Switch 添加到您的导入中:

import { Switch, Router, Route } from 'react-router'

【讨论】:

  • 我收到 Uncaught ReferenceError: Switch is not defined 使用 Switch 时出错
  • @NSCoder 确保您在模块顶部使用4.x.x 版本的react-routerrequireimport Switch
  • 如果我在 V-4 中使用 switch,它说 Warning: Failed prop type: The prop history` 在 Router 中被标记为必需,但它的值是 undefined。`跨度>
【解决方案3】:

我总是在 react web 和 native 中使用 Fragment (>= react 16)

import React, { Component, Fragment } from 'react'
import { NativeRouter as Routes, Route, Link } from 'react-router-native'
import Navigation from './components/navigation'    
import HomeScreen from './screens/home'
import { RecipesScreen } from './screens/recipe'

class Main extends Component {
  render() {
    return (
      <Fragment>
        <Navigation />
        <Routes>
          <Fragment>
            <Route exact path="/" component={HomeScreen} />
            <Route path="/recipes" component={RecipesScreen} />
          </Fragment>
        </Routes>
      </Fragment>
    )
  }
}

export default Main

【讨论】:

    【解决方案4】:

    我把我所有的&lt;Route /&gt;标签都放在&lt;Switch&gt; &lt;/Switch&gt;标签中,就像这样。

        <BrowserRouter>
            <Switch>
                <Route path='/' component={App} exact={true} /> 
                <Route path='/form-example' component={FormExample} />
            </Switch>
        </BrowserRouter>
    

    这样就解决了问题。

    【讨论】:

      【解决方案5】:

      如果您在路由器中嵌套其他组件,您应该这样做。

        <Router>
           <div>
             <otherComponent/>
               <div>
                 <Route/>  
                 <Route/>
                 <Route/>
                 <Route/>
               </div>
            </div>
          </Router>
      

      【讨论】:

        【解决方案6】:

        如果您使用Reach Routers,请确保代码如下所示:

        <Router>
            <Login path="/" />
            <Login path="/login" />
        </Router>
        

        在 React 路由器的情况下,将这些组件包含在 Div 中将使其工作,但在 Reach 路由器中,删除该 Div 元素。

        【讨论】:

          【解决方案7】:

          您还可以将所有路由包装在默认为索引页面的父路由中

          <Router history={history}>    
             <Route path="/" component={IndexPage}>
                <Route path="to/page" component={MyPage}/>
                <Route path="to/page/:pathParam" component={MyPage}/>
             </Route>    
          </Router>
          

          【讨论】:

            【解决方案8】:

            我正在使用版本为5.0.1react-router-dom 包,它与您的代码完美配合。

            import { BrowserRouter as Router , Router, Link } from 'react-router-dom';
            import Home from './pages/Home';
            import About from './pages/About';
            ...
            
            class App extends React.Component {
              render() {
                return (
                  <Router>
                    <ul>
                      <li><Link path='/'>Home</Link></li>
                      <li><Link path='/about'>About</Link></li>
                    </ul>
                    <Route path='/' exact component={Home} />
                    <Route path='/about' component={About} />
                  </Router>
                );
              }
            }
            
            export default App;
            

            【讨论】:

              【解决方案9】:

              不确定我的路由器是否过于简单,或者此规则发生了更改,但遵循了提到此限制的教程(“路由器”可能只有一个子元素)它允许我添加 3 条路线而不会出现任何错误。这是工作代码:

              function render() {
                ReactDOM.render(
                  <BrowserRouter>
                    <Route exact path="/" component={App} />
                    <Route path="/add" component={AddAuthorForm} />
                    <Route path="/test" component={test} />
                  </BrowserRouter>
                  ,
                  document.getElementById('root')
                );
              }
              

              这是我的依赖项:

              "react": "^16.13.1",
              "react-dom": "^16.13.1",
              "react-router-dom": "^5.1.2",
              "react-scripts": "3.4.1",
              

              【讨论】:

                【解决方案10】:

                当您在 &lt;Route&gt;inside &lt;Router&gt; 之前没有父标签时会出现此问题,因此要解决此问题,请将 &lt;Route&gt; 包含在父标签中,例如 &lt;div&gt;&lt;p&gt; 等。 示例 -

                <Router>
                    <p>
                       <Route path="/login" component={Login} />
                       <Route path="/register" component={Register} />
                    </p>
                </Router>
                

                【讨论】:

                • 大多数情况下,将

                  添加为父路由会使 html 无效,因为您不能在

                  中包含

                  ,例如
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-11-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-03-10
                • 2016-03-19
                相关资源
                最近更新 更多