【问题标题】:Why wouldn't React Router work with <Switch>?为什么 React Router 不能与 <Switch> 一起工作?
【发布时间】:2020-09-08 22:13:34
【问题描述】:

我正在学习 React 路由器,尝试构建一个非常基本的应用程序,像这样 Home.js:

import React from 'react';
import About from '../pages/About';
import { HashRouter as Router, Switch, Route, Link } from "react-router-dom";

const Navbar = () => {

    return (
        <Router>
            <div>
                <nav>
                    <ul>
                        <li>
                            <Link to="/">HOME</Link>
                        </li>
                        <li>
                            <Link to="/about-us">ABOUT US</Link>
                        </li>
                    </ul>
                </nav>
                <Switch>
                    <Route path="/about-us">
                        <About />
                    </Route>
                    <Route path="/">
                        <Home />
                    </Route>
                </Switch>
            </div>
        </Router>
    )
}

const Home = () => {
    return (
        <>
            <Navbar />
        </>
    )
}

export default Home;

然后在index.js渲染Home页面:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import Home from './pages/Home';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <React.StrictMode>
    <Home />
  </React.StrictMode>,
  document.getElementById('root')
);

serviceWorker.unregister();

问题是,Home 不会在 localhost:3000 中呈现,终端显示 Compiled successfully! 但是在加载 localhost:3000 时,它只是永远旋转而没有呈现任何内容。但是,如果我删除它呈现的元素。文件夹结构设置如下:

src
--pages
----About.js
----Home.js
index.js

谁能帮忙?

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    您已经根据其外观为自己创建了一个无限循环。你的 index.js 返回你的 Home 组件,然后返回 Navbar,它有一个路由器,然后返回 Home 组件,然后一遍又一遍地重复这个循环。

    这是我将采用的方法,它将在 about 和 home 页面上显示 Navbar,并且一次只显示一个基于当前路线的页面。

    // Navbar.js
    
    const Navbar = () => {
        return (
            <nav>
                <ul>
                    <li>
                        <Link to="/">HOME</Link>
                    </li>
                    <li>
                        <Link to="/about-us">ABOUT US</Link>
                    </li>
                </ul>
            </nav>
        )
    }
    
    export default Navbar;
    
    // Layout.js
    
    import React from 'react';
    import Navbar from './Navbar';
    import About from '../pages/About';
    import Home from '../pages/Home';
    import { HashRouter as Router, Switch, Route, Link } from "react-router-dom";
    
    const Layout = () => {
        return (
            <Router>
                <Navbar />
    
                <Switch>
                    <Route path="/about-us">
                        <About />
                    </Route>
                    <Route path="/">
                        <Home />
                    </Route>
                </Switch>
            </Router>
        )
    }
    
    export default Layout;
    
    // index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import Layout from './components/Layout';
    import * as serviceWorker from './serviceWorker';
    
    ReactDOM.render(
      <React.StrictMode>
        <Layout />
      </React.StrictMode>,
      document.getElementById('root')
    );
    
    serviceWorker.unregister();
    
    src
    --components
    ----Navbar.js
    ----Layout.js
    --pages
    ----About.js
    ----Home.js
    index.js
    

    【讨论】:

    • 我真正想要的是Home.js作为主页,它使用Navbar.js作为组件,并在Navbar.js中设置路由器,因为那是发生路由的地方。 Home.js 直接渲染在index.js 中。您可以根据此编辑您的答案吗?
    • 您不能在 Home.js 中使用 Navbar,也不能在 Navbar 内完成路由器。这将导致您遇到的无限循环。您将需要提取路由器并在其他地方使用它。如果有帮助,我可以向您展示我采用的方法。
    • 如果我想在Home 中包含Navbar 组件,但又想在Navbar 中路由到Home 页面,如何避免循环?看不到如何避免死循环
    • 我已经更新了我的答案以反映一种可能的方法。
    猜你喜欢
    • 2021-08-02
    • 2017-04-14
    • 2010-10-28
    • 2021-04-29
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多