Javascript 反应路由器与专用路由呈现空白页
已阅读所有相关主题,但仍未找到答案 各位好, 我的代码中有一个bug,我总是找不到它,所以请帮助我找到让它工作的方法 我创建了react应用程序,尝试在其中添加用户身份验证。我正在查看的教程: 问题:当我登录时,我看到“仪表板”(精确)组件,一切正常。然后我点击其他链接,比如“订单”等等。我得到的是一个空白页面。控制台上没有错误 让我们从头开始 index.jsJavascript 反应路由器与专用路由呈现空白页,javascript,reactjs,Javascript,Reactjs,已阅读所有相关主题,但仍未找到答案 各位好, 我的代码中有一个bug,我总是找不到它,所以请帮助我找到让它工作的方法 我创建了react应用程序,尝试在其中添加用户身份验证。我正在查看的教程: 问题:当我登录时,我看到“仪表板”(精确)组件,一切正常。然后我点击其他链接,比如“订单”等等。我得到的是一个空白页面。控制台上没有错误 让我们从头开始 index.js import React from 'react'; import ReactDOM from 'react-dom'; import
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { configureFakeBackend } from './_helpers/fake-backend';
configureFakeBackend();
ReactDOM.render((
<App />
), document.getElementById('root'));
从“React”导入React;
从“react dom”导入react dom;
导入“./index.css”;
从“./App”导入应用程序;
从“/_helpers/fake backend”导入{configureFakeBackend};
configureFakeBackend();
ReactDOM.render((
),document.getElementById('root');
App.js文件
import React, { Component } from 'react';
import './App.scss';
import MainContent from './components/MainContent.jsx';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import { PrivateRoute } from './components/PrivateRoute';
import { LoginPage } from './LoginPage/LoginPage';
class App extends Component {
render() {
return (
<Router>
<Switch>
<PrivateRoute exact path="/" component={MainContent} />
<Route path="/login" component={LoginPage} />
</Switch>
</Router>
);
}
}
export default App;
import React,{Component}来自'React';
导入“/App.scss”;
从“/components/MainContent.jsx”导入MainContent;
从“react Router dom”导入{BrowserRouter as Router,Route,Switch};
从“./components/PrivateRoute”导入{PrivateRoute};
从“./LoginPage/LoginPage”导入{LoginPage};
类应用程序扩展组件{
render(){
返回(
);
}
}
导出默认应用程序;
PrivateRoute.jsx
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
export const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
localStorage.getItem('user')
? <Component {...props} />
: <Redirect to={{ pathname: '/login', state: { from: props.location } }} />
)} />
)
从“React”导入React;
从“react router dom”导入{Route,Redirect};
导出常量PrivateRoute=({component:component,…rest})=>(
(
localStorage.getItem('用户')
?
:
)} />
)
MainContent.jsx
import React, { Component } from 'react';
import Sidebar from './Sidebar.jsx';
import Header from './Header.jsx';
import Main from './Main.jsx';
import { userService } from '../_services/user.service';
import { Link } from 'react-router-dom';
class MainContent extends Component {
constructor(props) {
super(props);
this.state = {
user: {},
users: []
};
}
componentDidMount() {
this.setState({
user: JSON.parse(localStorage.getItem('user')),
users: { loading: true }
});
userService.getAll().then(users => this.setState({ users }));
}
render() {
const { user, users } = this.state;
return (
<React.Fragment>
<h1>Hi {user.firstName}!</h1>
{users.loading && <em>Loading users...</em>}
{users.length &&
<ul>
{users.map((user, index) =>
<li key={user.id}>
{user.firstName + ' ' + user.lastName}
</li>
)}
</ul>
}
<p>
<Link to="/login">Logout</Link>
</p>
<Sidebar />
<div id="flexing">
<Header />
<Main />
</div>
</React.Fragment>
);
}
}
export default MainContent;
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Dashboard from './Dashboard';
import Orders from './Orders';
import Routes from './Routes';
import Drivers from './Drivers';
import Settings from './Settings';
const Main = () => (
<main>
<Switch>
<Route exact path='/' component={Dashboard}/>
<Route path='/orders' component={Orders}/>
<Route path='/routes' component={Routes}/>
<Route path='/drivers' component={Drivers}/>
<Route path='/settings' component={Settings}/>
</Switch>
</main>
);
export default Main;
import React,{Component}来自'React';
从“./Sidebar.jsx”导入侧栏;
从“./Header.jsx”导入标头;
从“/Main.jsx”导入Main;
从“../\u services/user.service”导入{userService};
从'react router dom'导入{Link};
类MainContent扩展组件{
建造师(道具){
超级(道具);
此.state={
用户:{},
用户:[]
};
}
componentDidMount(){
这个.setState({
用户:JSON.parse(localStorage.getItem('user')),
用户:{正在加载:true}
});
然后(users=>this.setState({users}));
}
render(){
const{user,users}=this.state;
返回(
你好{user.firstName}!
{users.loading&&loading users…}
{users.length&&
{users.map((用户,索引)=>
-
{user.firstName+''+user.lastName}
)}
}
注销
);
}
}
导出默认主内容;
至少:Main.jsx
import React, { Component } from 'react';
import Sidebar from './Sidebar.jsx';
import Header from './Header.jsx';
import Main from './Main.jsx';
import { userService } from '../_services/user.service';
import { Link } from 'react-router-dom';
class MainContent extends Component {
constructor(props) {
super(props);
this.state = {
user: {},
users: []
};
}
componentDidMount() {
this.setState({
user: JSON.parse(localStorage.getItem('user')),
users: { loading: true }
});
userService.getAll().then(users => this.setState({ users }));
}
render() {
const { user, users } = this.state;
return (
<React.Fragment>
<h1>Hi {user.firstName}!</h1>
{users.loading && <em>Loading users...</em>}
{users.length &&
<ul>
{users.map((user, index) =>
<li key={user.id}>
{user.firstName + ' ' + user.lastName}
</li>
)}
</ul>
}
<p>
<Link to="/login">Logout</Link>
</p>
<Sidebar />
<div id="flexing">
<Header />
<Main />
</div>
</React.Fragment>
);
}
}
export default MainContent;
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Dashboard from './Dashboard';
import Orders from './Orders';
import Routes from './Routes';
import Drivers from './Drivers';
import Settings from './Settings';
const Main = () => (
<main>
<Switch>
<Route exact path='/' component={Dashboard}/>
<Route path='/orders' component={Orders}/>
<Route path='/routes' component={Routes}/>
<Route path='/drivers' component={Drivers}/>
<Route path='/settings' component={Settings}/>
</Switch>
</main>
);
export default Main;
从“React”导入React;
从“react router dom”导入{Switch,Route};
从“/Dashboard”导入仪表板;
从“/订单”导入订单;
从“./Routes”导入路由;
从“./Drivers”导入驱动程序;
从“./Settings”导入设置;
常量Main=()=>(
);
导出默认主;
因此,仪表板组件将呈现良好效果,但其他组件呈现为空白页面。请帮我修一下。等待答复
正如正确的那样,Main.js中的这些路由只有在App.js呈现时才会呈现。也就是说,当路径为
/
时,将呈现Main.js。当它是其他东西时,Main.js不会被渲染,所以开关组件永远不会被点击
要解决这个问题,您应该删除Main.js并将所有这些路由放在顶层(如果有帮助的话,您可以在App.js中有两个Switch
组件),或者在App.js中设置路径(对于MainComponent)以包含所有这些路由。前者更干净,因为后者可能变得复杂
要知道这是问题所在,请向App.js添加一个默认路由,您将看到您看到的“空白”页面是因为在该级别没有匹配的内容;要设置默认值,请在
*
上匹配路径。请检查是否需要作为默认值导入PrivateRoute
@Justas。请保留完整的工作代码,谢谢您的帮助。我在PrivateRouter中添加了第二个开关到App.js,解决了这个问题。所以你的(如果有帮助的话,你可以在App.js中有两个开关组件)
对我帮助很大。