Вложенные компоненты с React Router

Я следую онлайн-учебнику React. В учебном пособии React Router 3 использовался, когда я получил React Router 4, когда я загружал React Router (и react-router-dom). Код в учебнике выглядит следующим образом.

import React from "react";
import {render} from "react-dom";
import {Router, Route, browserHistory} from 'react-router'

import {Root} from "./components/Root";
import {Home} from "./components/Home";
import {User} from "./components/User";

class App extends React.Component {
    render() {
        return (
            <Router history={browserHistory}>
                <Route path={"/"} component={Root}>
                    <Route path={"user"} component={User}/>
                    <Route path={"home"} component={Home}/>
                </Route>
            </Router>
        );
    }
}

render(<App />, window.document.getElementById('app'));  

Я пытаюсь переписать код для работы с React Router 4 следующим образом:

import React from "react";
import {render} from "react-dom";
import {Switch, BrowserRouter, Route} from 'react-router-dom'

import {Root} from "./components/Root";
import {Home} from "./components/Home";
import {User} from "./components/User";

class App extends React.Component {
    render() {
        return (
            <BrowserRouter>
                <Switch>
                    <Route path="/" component={Root}>
                        <Route path="/user" component={User}/>
                        <Route path="/home" component={Home}/>
                    </Route>
                </Switch>
            </BrowserRouter>
        );
    }
}

render(<App />, window.document.getElementById('app'));

Это дает мне ошибку:

Warning: You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored

Я пытался обернуть дочерние компоненты с <Switch> а также <Root> но это не сработало. Как следует обернуть дочерние компоненты?

1 ответ

Решение

В React Router 4 вы больше не вкладываете маршруты. В вашем случае вы можете поместить маршруты в дочерний компонент, например так:

class App extends React.Component {
    render() {
        return (
            <BrowserRouter>
                <Route path="/" component={Root} />
            </BrowserRouter>
        );
    }
}

class Root extends React.Component {
    render() {
        return (
            <div>
                <Route path="/user" component={User}/>
                <Route path="/home" component={Home}/>
            </div>
        );
    }
}

Кроме того, я не думаю, что вам нужно использовать Switch здесь, так как он будет соответствовать только одному первому дочернему маршруту, и он, кажется, не нужен в вашем случае.

Другие вопросы по тегам