【问题标题】:View wont update but the URL does in React Router V6View 不会更新,但 URL 在 React Router V6 中会更新
【发布时间】:2020-12-17 02:50:50
【问题描述】:

我正在使用 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;

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    对于 react-router v5:

    使用Switchexact

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

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

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


    如果您使用react-router v6,如here 所述,则将Switch 替换为Routes,您不需要使用exact,因为所有&lt;Route&gt; 路径都完全匹配 em> 默认情况下:

    <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>
      );
    }
    

    【讨论】:

    • 但是我认为你在 v6 中不使用 switch?
    【解决方案2】:

    首先,我猜你这里使用的是 React 路由器 V6 版本,如果是稳定的 V5 版本,上面使用 &lt;Switch&gt; 的解决方案,'exact' 绝对可以正常工作。

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

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

    【讨论】:

    • 到达我试图使用反应路由器 v6,但它不会更新任何东西,但没有错误。你的代码会很好用吗? sidebarright 的 rotuter 只是一个测试应用程序。它是我试图将其添加到的父级。'
    • 它对我有用,请参考此代码 sandox codesandbox.io/s/…
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 所以这可能是它根本不起作用的原因?让我在一个小时内尝试:)
    • 还是不行。点击链接不会做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多