【问题标题】:Updating the `URL` but not loading the path更新“URL”但不加载路径
【发布时间】:2020-02-28 20:22:31
【问题描述】:

导航栏路线不起作用。

我有一个navbar component,它充当菜单栏。这个navbar component 路由到About component。我还有一个Route.js,我在其中为应用程序的其余部分实现了路由。 Route.js 是我正在加载 Navbar component 的位置。

它正在更新URL,但不加载路径。

Complete code can be found here:

Navbar component

import React, { Fragment } from 'react'
import {
    BrowserRouter as Router,
    Route,
    Link,
} from "react-router-dom";

import { makeStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import Divider from '@material-ui/core/Divider';

import About from '../pages/About';

const useStyles = makeStyles({
    hr: {
        width: '0.5px',
        height: '25px',
        backgroundColor: '#fff',
        margin: '0px 10px',
    },
    a: {
        color: '#ffffff',
        cursor: 'pointer',
        textDecoration: 'none',
    },
});

const Navbar = () => {
    const classes = useStyles();
    return (
        <Fragment>
            <Router>
                <AppBar position="static" width='100%'>
                    <Toolbar>
                        <Typography variant="h6" >
                            <Link to='/' className={classes.a}> Todo List Application </Link>
                        </Typography>
                        <Divider orientation="vertical" className={classes.hr} />
                        <Link to='../pages/About.js' className={classes.a}>
                            About
                        </Link>
                    </Toolbar>
                </AppBar>
                <Route path="/about.js" component={About}>
                    <About />
                </Route>
            </Router>
        </Fragment>
    );
}

export default Navbar;

这个AppRouter被加载到App.js

【问题讨论】:

  • 直接编辑浏览器url到/about.js时,你看到About组件了吗?此外,您不想将 .js 扩展名添加到您的 url 路径,因为它看起来既尴尬又危险,所以我建议只使用 /about
  • 我已使用以下建议的更改修改了我的代码。但现在,问题是它同时显示home componentabout component。检查此屏幕截图。 imgur.com/a/7x8tRX8

标签: reactjs redux react-router-dom


【解决方案1】:

我克隆了你的项目并运行了它。

更新了 Navbar.js,(移除了 AppBar 中的 Router 封装,并移除了 Navbar 组件中的 Route 声明)

import React, { Fragment } from 'react'
import { BrowserRouter as Router, Route, Link} from "react-router-dom";

import { makeStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import Divider from '@material-ui/core/Divider';

import About from '../pages/About';

const useStyles = makeStyles({
    hr: {
        width: '0.5px',
        height: '25px',
        backgroundColor: '#fff',
        margin: '0px 10px',
    },
    a: {
        color: '#ffffff',
        cursor: 'pointer',
        textDecoration: 'none',
    },
});

const Navbar = () => {
    const classes = useStyles();
    return (
        <Fragment>

                <AppBar position="static" width='100%'>
                    <Toolbar>
                        <Typography variant="h6" >
                            <Link to='/' className={classes.a}> Todo List Application </Link>
                        </Typography>
                        <Divider orientation="vertical" className={classes.hr} />
                        <Link to='/about' className={classes.a}>
                            About
                        </Link>
                    </Toolbar>
                </AppBar>

        </Fragment>
    );
}

export default Navbar;

更新了 src/routes/index.js(在此处添加了 about Route 并使用 Switch 封闭了 Routes)

import React from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import TrelloBoard from "../components/TrelloBoard";
import Home from "../components/Home";
import Navbar from "../components/navbar/Navbar";
import About from "../components/pages/About";

const AppRouter = () => {
    return (

        <Router>
            <div>
                <Navbar></Navbar>
                <Switch>
                    <Route path="/about" component={About} />
                    <Route path="/:boardID" component={TrelloBoard} />
                    <Route path="/" exact component={Home} />
                </Switch>
            </div>
        </Router>
    );
};

export default AppRouter;

我认为上述更改按您的预期工作。

【讨论】:

    【解决方案2】:

    您的&lt;Link&gt; 组件需要一个参数to,它是您路由器中定义&lt;Route&gt; 的定义网址。

    在您的示例中,您似乎正在尝试使用相对路径访问 js 文件,但这不是 react-router-dom 的工作方式。

    尝试替换为:

    <Link to='/about' className={classes.a}>
    

    并确保您定义了相同的路线:

    <Switch>
        <Route exact path="/" component={Home}>
        <Route path="/about">
            <About />
        </Route>
    </Switch>
    

    &lt;Switch&gt; 浏览其所有子级 元素并渲染其路径的第一个元素 匹配当前 URL。随时使用 你有多条路线,但你只想要一条 其中一次渲染

    您可以在 react router basic documentation 上查看完整的工作示例,它运行此 sandbox

    【讨论】:

    • 它可以工作,但它显示home componentabout component。检查此屏幕截图。 imgur.com/a/7x8tRX8
    • 可能来自您的/ 路线,需要准确的&lt;Route exact path="/"&gt;
    • 好的。但即使我从那里删除exact,它仍然保持不变。
    猜你喜欢
    • 2020-04-29
    • 2022-01-10
    • 2021-03-29
    • 2020-04-07
    • 2020-04-21
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多