繁体   English   中英

视图不会更新,但 URL 在 React Router V6 中会更新

[英]View wont update but the URL does in React Router V6

我正在使用react router V6并且一直在遵循本教程进行路由设置: https : //blog.logrocket.com/react-router-v6/但当我单击导航菜单中的链接时,视图不会更新。

访问localhost:3000/Crime会呈现正确的组件。
访问localhost:3000 / 呈现正确的组件。

但是当点击链接时,视图不会更新,但 url 路径会更新。

游戏组件:

import React, { Component } from "react";
//import Component from 'react-dom';
import SideBarRight from "./components/game/sideBarRight.jsx";
import SideBarLeft from "./components/game/sideBarLeft.jsx";
import Crime from "./components/game/crime.jsx";

import "./gameComponent.css";
import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";

class GameComponent extends Component {
  constructor() {
    super();
    this.state = { color: "red" };
  }

  render() {
    return (
      <div className="main">
        data testing:
        <Router>
          <nav style={{ margin: 10 }}>
            <Link to="/" style={{ padding: 5 }}>
              Home
            </Link>
            <Link to="/crime" style={{ padding: 5 }}>
              Crime
            </Link>
          </nav>
          <Route path="/" element={<SideBarRight />} />
          <Route path="/crime" element={<Crime />} />
        </Router>
      </div>
    );
  }
}

export default GameComponent;

犯罪成分:

import React, { Component } from "react";
//import Component from 'react-dom';
import "./../../gameComponent.css";

class Crime extends Component {
  constructor() {
    super();
    this.state = {
      color: "red",
      user: {
        cash: 0,
        bank: 0,
        weapon: "",
        username: "test",
        locationname: "Bankok",
        defence: 0,
      },
      rankbar: { rankpercent: 50, rank: "Mafia" },
    };
  }

  render() {
    return <span>crimeday</span>;
  }
}

export default Crime;

侧边栏

import React, { Component } from "react";
//import Component from 'react-dom';
import "./../../gameComponent.css";
import {
  BrowserRouter,
  BrowserRouter as Router,
  Switch,
  Route,
  Link,
} from "react-router-dom";

class SideBarLeft extends Component {
  constructor() {
    super();
    this.state = { color: "red" };
  }

  render() {
    return (
      <div className="content_sidebar">
        <div className="header">
          <span>Computerbar1</span>
        </div>
        <BrowserRouter>
          <ul>
            <li>
              <Link to="/">Clear</Link>
            </li>
            <li>
              <Link to="/crime">Crime</Link>
            </li>
          </ul>
        </BrowserRouter>
      </div>
    );
  }
}

export default SideBarLeft;

您可以尝试像这样将exact添加到您的Route

<Route exact path="/" element={<SideBarRight />} />
<Route path="/crime" element={<Crime />} />

原因是"/""/crime"都以/开头,如果没有exact关键字,React 认为它们是相同的路径。

编辑:更多的信息exact这里https://reactrouter.com/web/api/Route/exact-bool

对于反应路由器 v5:

使用Switch精确

<Switch>
  <Route exact path="/" element={<SideBarRight />} />
  <Route exact path="/crime" element={<Crime />} />
</Switch>

Switch呈现与位置匹配的第一个子RouteRedirect exacttrue ,只有当路径与location.pathname完全匹配时,路由才会匹配。

当您的路线有嵌套的子路线时,您不应该使用exact ,例如,如果您有/crimes/summary/crimes/details等作为/crimes子路线。


如果您使用的反应路由器V6 ,作为解释在这里,您更换SwitchRoutes ,你不需要使用exact ,因为所有的<Route>路径默认情况下精确匹配:

<BrowserRouter>
  <nav style={{ margin: 10 }}>
    <Link to="/" style={{ padding: 5 }}>
      Home
    </Link>
    <Link to="/crime" style={{ padding: 5 }}>
      Crime
    </Link>
  </nav>
  <Routes>
    <Route path="/" element={<SideBarRight />} />
    <Route path="/crime" element={<Crime />} />
  </Routes>
</BrowserRouter>

此外,您不需要多次使用BrowserRouter ,因此您的SideBarRight可能如下所示:

function SideBarRight() {
  return (
    <div className="content_sidebar">
      <div className="header">
        <span>Computerbar1</span>
      </div>
      {/* <BrowserRouter> -> NOT REQUIRED */}
      <ul>
        <li>
          <Link to="/">Clear</Link>
        </li>
        <li>
          <Link to="/crime">Crime</Link>
        </li>
      </ul>
      {/* </BrowserRouter> */}
    </div>
  );
}

首先,我猜你在这里使用的是 React router V6 版本,如果它是稳定的 V5 版本,上面使用<Switch>解决方案,'exact' 绝对可以正常工作。

我在您的代码中看到的错误是:

  1. 在 GameComponent 中,使用<Routes><Route>路径括起来,如下所示,否则 '/' 将匹配 '/' 和 '/crime'
      <Routes>
           <Route path="/" element={<SideBarRight />} />
           <Route path="/crime" element={<Crime />} />
      </Routes>
  1. <SideBarRight>组件中删除<BrowserRouter> ,它应该只为应用程序添加一次

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM