【问题标题】:React routing within another component V6在另一个组件 V6 中反应路由
【发布时间】:2020-12-19 00:49:46
【问题描述】:

我正在使用 Reavt V6 路由。

我正在努力让我在游戏组件中的路线正常工作。

访问 /test 会导致页面完全空白。虽然它应该在游戏组件中加载犯罪模块。 访问 / 渲染游戏组件,但 /test 不渲染游戏组件和其中的路由。

我如何使它工作?

访问 url /crime 应该会加载 gamecomponent,然后

<Route path="/test" element={<Crime />} />

应该被加载。

app.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;

私人路由:

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;

游戏组件:

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;

【问题讨论】:

    标签: reactjs react-router react-router-component


    【解决方案1】:

    根据 React Router 文档:

    您可以在任何需要的地方渲染元素,包括 在另一个组件树的深处。这些将起作用 和其他的一样,除了它们会自动 建立在呈现它们的路线的路径上。如果你这样做, 确保将 * 放在父路由路径的末尾。否则 当父路由比父路由长时,它不会匹配 URL 路线的路径,你的后代永远不会出现。

    您可以在此处阅读更多相关信息 - Descendant Routes

    所以,你只需要做 2 点小改动:

    app.js

    * 添加到PrivateRoute 中的路径:

    <Routes>
       <Route path="/login" element={<Login />} />
       <PrivateRoute
          isAuth={true}
          // Here's the trick
          path="/*"
          component={GameComponent}
          redirectTo="/login"
       />
    </Routes>
    

    gamecomponent.jsx

    包装器Route&lt;Routes&gt;

    <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>
    

    这是一个代码示例:codesandbox

    您可以通过路线查看:

    / => 显示犯罪成分

    /crime => 显示犯罪成分

    /anticrime => 显示反犯罪组件

    【讨论】:

    • 它似乎可以进入游戏组件。随着游戏组件正确加载,但视图不存在。 middleContentHolder 为空。
    • 看起来它不会在路线中显示任何内容。
    • 嗨@MalinPedersen,我用它做了一个POC并且工作正常。它没有为您显示路线吗?喜欢/crime
    • /crime 加载游戏组件,但在应该加载犯罪的 middleContentHolder 中没有任何内容。 (你有什么可以聊天的地方吗?)
    • 如果我告诉你我不知道如何从这里开始聊天 (LOL)。所以,我为你添加了一个代码示例。
    【解决方案2】:

    您应该使用:component={Crime},而不是 element={&lt;Crime /&gt;}

    查看documentation 以供参考。

    在您的PrivateRoute 组件中,您可能希望使用&lt;Redirect&gt; 组件对其进行增强。

    请参考这个question的答案,甚至有一个很好的解释可能对你有帮助的帖子。

    【讨论】:

    • 嗯。将我的元素更改为组件 etg 犯罪路线。但这不会产生任何影响,但它仍然不会加载。会看那个答案。
    • 这会在 v6 @rleiva93 中产生任何差异吗?
    • 如果它与 React Router (reactrouter.com/web/api/Route/component) 的当前文档相匹配,则不会有任何区别。
    • 不幸的是@rleiva93
    • 你说得完全正确......对此感到抱歉......你可能想检查一下:github.com/ReactTraining/react-router/blob/dev/docs/…我想你还没有弄清楚。
    猜你喜欢
    • 2021-12-20
    • 2022-01-11
    • 2021-10-17
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2022-08-22
    • 2021-03-29
    相关资源
    最近更新 更多