Ane*_*lie 2 reactjs react-router react-router-component
我使用 Reavt V6 路线。
我正在努力让我的游戏组件中的路线工作。
访问 /test 结果是一个完全空白的页面。而它应该在游戏组件中加载犯罪模块。访问 / 渲染游戏组件,但 /test 不渲染游戏组件和其中的路由。
我如何使这个工作?
访问 url /crime 应该会导致被gamecomponent加载,并且
<Route path="/test" element={<Crime />} />
Run Code Online (Sandbox Code Playgroud)
应该加载。
应用程序.js
import React from 'react';
import logo from './logo.svg';
import './App.css';
import GameComponent from './gameComponent.jsx';
import { BrowserRouter as Router } from 'react-router-dom';
import { Routes, Route, Navigate, Outlet, Switch } from 'react-router-dom';
import PrivateRoute from './PrivateRoute';
import Login from './components/login/login.jsx';
function App() {
return (
<Router>
<Routes>
<Route path="/login" element={<Login />} />
<PrivateRoute isAuth={true} path="/" component={GameComponent} redirectTo='/login'/>
</Routes>
</Router>
);
}
export default App;
Run Code Online (Sandbox Code Playgroud)
私人路线:
import React from 'react';
import PropTypes from 'prop-types';
import { Route, Navigate } from 'react-router-dom';
import { useNavigate } from "react-router-dom";
import Login from './components/login/login.jsx';
import GameComponent from './gameComponent.jsx';
const PrivateRoute = ({ component: Component, redirectTo, isAuth, path, ...props }) => {
//isAuth = false;
if(!isAuth) {
return <Navigate to={redirectTo} />;
}
return <Route path={path} element={<Component />} />
};
export default PrivateRoute;
Run Code Online (Sandbox Code Playgroud)
游戏组件:
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 Login from './components/login/login.jsx';
import './gameComponent.css';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import { BrowserRouter} from "react-router-dom";
class GameComponent extends Component{
constructor() {
super();
this.state = {
userData: {
user: {cash:0, bank:0, weapon:'', username: 'test', locationname: 'Bankok',
defence: 0},
rankbar: {rankpercent: 50, rank: 'Mafia'},
}
}
}
render() {
return (
<div className="main">
<div className="sidebar left">
<SideBarLeft/>
</div>
<div className="middleContentHolder">
<Route path="/" element={<Crime />} />
<Route path="/test" element={<Crime />} />
<Route path="/crime" element={<Crime />} />
<Route path="/test2" element={<SideBarRight UserData={this.state.userData} />} />
<div className="col-8">
<div className="content">
<div className="header"><span>Test...</span></div>
</div>
</div>
</div>
<div className="sidebar right">
<SideBarRight UserData={this.state.userData}/>
</div>
</div>
);
}
}
export default GameComponent;
Run Code Online (Sandbox Code Playgroud)
根据 React Router 文档:
您可以在任何需要的地方渲染元素,包括在另一个 的组件树深处。这些将与任何其他 一样工作,除了它们将自动构建在呈现它们的路线的路径上。如果这样做,请确保在父路由路径的末尾放置一个 *。否则,当 URL 长于父路由的路径时,父路由将与 URL 不匹配,并且您的后代将永远不会出现。
您可以在此处阅读更多相关信息 -后代路线
所以,你只需要做两个小改动:
应用程序.js
添加*到您的路径中PrivateRoute:
<Routes>
<Route path="/login" element={<Login />} />
<PrivateRoute
isAuth={true}
// Here's the trick
path="/*"
component={GameComponent}
redirectTo="/login"
/>
</Routes>
Run Code Online (Sandbox Code Playgroud)
游戏组件.jsx
包装Route有<Routes>:
<Routes>
<Route path="/" element={<Crime />} />
<Route path="/test" element={<Crime />} />
<Route path="/crime" element={<Crime />} />
<Route
path="/test2"
element={<SideBarRight UserData={this.state.userData} />}
/>
</Routes>
Run Code Online (Sandbox Code Playgroud)
这是代码示例:codeandbox
您可以使用路线检查它:
/ => 显示犯罪成分
/crime => 显示犯罪成分
/anticrime => 显示反犯罪组件
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |