gpt4 book ai didi

reactjs - React Router 不渲染组件

转载 作者:行者123 更新时间:2023-12-03 13:50:09 24 4
gpt4 key购买 nike

我想创建一个需要登录的 React 应用程序。为了维护用户状态,我想使用 Context API随 React 16.3 引入。在实现登录路由时,我遵循 example in React Router documentation .

下面的源代码(正如我希望的那样)是我的问题的一个非常简化的最小示例。当我在浏览器中打开 localhost:3000/protected 时,URL 正确更改为 localhost:3000/login,但未显示该组件。 render() 方法似乎没有被调用。

如何说服 React 渲染我的登录组件?

这是我的源代码。

App.js

import React, {Component} from 'react';
import {
BrowserRouter as Router,
Route
} from 'react-router-dom'
import Login from "./Login";
import Protected from "./Protected";
import ProtectedRoute from "./ProtectedRoute";
import UserContext from "./UserContext";

export default class App extends Component {
render() {
return (
<Router>
<UserContext.Provider value={false}>
<div>
<ProtectedRoute path='/protected' component={Protected}/>
<Route path='/login' component={Login}/>
</div>
</UserContext.Provider>
</Router>
);
}
}

Login.js

import React from 'react';

export default class Login extends React.Component {
render() {
return <p>Login</p>;
}
}

UserContext.js

import React from "react";
const UserContext = React.createContext();
export default UserContext;

ProtectedRoute.js

import React from 'react'
import {Redirect, Route} from "react-router-dom";
import UserContext from './UserContext';

const ProtectedRoute = ({component: Component, ...rest}) => (
<Route {...rest} render={props =>
<UserContext.Consumer>
{loggedIn =>
loggedIn === true
? <Component {...props} />
: <Redirect to={{
pathname: '/login',
state: {from: props.location}
}}/>
}
</UserContext.Consumer>
}
/>
);

export default ProtectedRoute;

protected .js

import React from 'react';

export default class Protected extends React.Component {
render () {
return <h2>protected</h2>;
}
}

最佳答案

看起来这是一个错误:https://github.com/ReactTraining/react-router/issues/6072 ,甚至可能是一个 React bug:https://github.com/facebook/react/issues/12551 .

目前,您可以通过在单独的组件中渲染 Router 和上下文提供程序来解决这个问题。例如这样:

const Routes = () => (
<UserContext.Provider value={false}>
<div>
<ProtectedRoute path='/protected' component={Protected}/>
<Route path='/login' component={Login}/>
</div>
</UserContext.Provider>
);

export default class App extends Component {
render() {
return (
<Router>
<Routes/>
</Router>
);
}
}

关于reactjs - React Router 不渲染组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49756074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com