【发布时间】:2020-09-19 03:41:54
【问题描述】:
我试图仅在用户登录时才呈现某些组件。用户是否登录由存储在 redux 存储中的当前用户对象确定。问题是包含路由的主 App 组件在其第一次渲染调用之前没有立即将当前用户对象接收到它的 props。因此,它重定向到登录页面。一两秒后,主 App 组件最终将对象接收到它的 props 中,并重定向到它最初应该有的位置。
我试图将条件移到实际组件的渲染方法中,但该组件在其第一次渲染之前仍然没有从 redux 存储接收用户对象作为道具,导致登录页面相同的“闪烁” .
class App extends React.Component {
constructor() {
super();
}
unsubscribeFromAuth = null;
async componentDidMount(): void {
this.unsubscribeFromAuth = await auth.onAuthStateChanged(async userAuth => {
if (userAuth) {
await this.props.setCurrentUser(userAuth);
}
})
}
componentWillUnmount(): void {
this.unsubscribeFromAuth();
}
render() {
return (
<div>
<Navbar />
<BrowserRouter history={history}>
<div>
<Switch>
<Route exact={true} path={'/register'} render={() => this.props.currentUser
? <Profile/>
: <Register/>}/>
<Route exact={true} path={'/profile'} render={() => this.props.currentUser
? <Profile/>
: <Login/>}/>
<Route exact={true} path={'/login'} render={() => this.props.currentUser
? <Events/>
: <Login/>}/>
<Route exact={true} path={'/events'} render={() => this.props.currentUser
? <Events/> : <Login/>}/>
<Route exact={true} path={'/my_events'} render={() => this.props.currentUser
? <MyEvents/> : <Login/>}/>
<Route exact={true} path={'/new_event'} render={() => this.props.currentUser
? <NewEvent/> : <Login/>}/>
<Route exact={true} path={'/edit_event'} render={() => this.props.currentUser
? <EventEdit/>
: <Login/>}/>
<Route exact={true} path={'/apply-to-event'} render={() => this.props.currentUser
? <ApplyToEvent/>
: <Login/>}/>
<Route path={'/'} render={() => this.props.currentUser
? <Events/>
: <Login/>}/>
</Switch>
</div>
</BrowserRouter>
</div>
);
}
}
const mapStateToProps = ({ user }) => ({
currentUser: user.currentUser
});
const mapDispatchToProps = (dispatch) => ({
setCurrentUser: async user => await dispatch(setCurrentUser(user))
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(App);
我想找到一种方法来呈现组件,而不会出现登录组件的闪烁/闪烁。
【问题讨论】:
标签: javascript reactjs react-redux react-router