[英]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>
<Route exact path="/" element={<SideBarRight />} />
<Route exact path="/crime" element={<Crime />} />
</Switch>
Switch
呈现与位置匹配的第一个子Route
或Redirect
。 当exact
为true
,只有当路径与location.pathname
完全匹配时,路由才会匹配。
当您的路线有嵌套的子路线时,您不应该使用exact
,例如,如果您有/crimes/summary
或/crimes/details
等作为/crimes
子路线。
如果您使用的反应路由器V6 ,作为解释在这里,您更换Switch
与Routes
,你不需要使用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' 绝对可以正常工作。
我在您的代码中看到的错误是:
<Routes>
将<Route>
路径括起来,如下所示,否则 '/' 将匹配 '/' 和 '/crime' <Routes>
<Route path="/" element={<SideBarRight />} />
<Route path="/crime" element={<Crime />} />
</Routes>
<SideBarRight>
组件中删除<BrowserRouter>
,它应该只为应用程序添加一次
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.