React App 组件不根据条件逻辑呈现
React App component not rendering based on conditional logic
这个组件的逻辑我觉得不错。
- 假设
isReceivedSession
为真,<ReactFragment/>
呈现;如果不是,<Spinner/>
应该呈现
- 在片段中,如果
isLoadingApp || isLoadingAuth
为真,则应呈现 <Spinner/>
组件;如果语句不真实,则返回一条线和路由器并渲染。
但即使 isLoadingApp
在控制台中记录为真,微调器也永远不会出现。我只看到一个片段(什么都没有)或预期的线路和路由器导航路径。
当 isLoadingApp
计算结果为真时,微调器组件应该可见。
我觉得我在这里遗漏了更深层次的东西...逻辑上的缺陷在哪里?
const App = ({ classes }: IProps) => {
const dispatch = useDispatch();
const [isReceivedSession, setIsReceivedSession] = useState(false);
const isLoadingAuth: boolean = useSelector(authIsLoadingSelector);
const isLoadingApp: boolean = useSelector(appIsLoadingSelector);
useEffect(() => {
(async () => {
try {
const sessionData = await CognitoClient.currentSession();
const currentSessionToken = sessionData.getAccessToken().getJwtToken();
if (currentSessionToken) {
dispatch(authActions.setAuthStatus(AUTH_STATUS.LOGGED_IN));
}
} finally {
setIsReceivedSession(true);
}
})();
}, []);
//all logging values properly
console.log("isReceivedSession", isReceivedSession);
console.log("isLoadingApp ", isLoadingApp);
console.log("isLoadingAuth ", isLoadingAuth)
return isReceivedSession ? (
//spinner never renders even when isLoadingApp is true
<Fragment>
{isLoadingApp ||
(isLoadingAuth && <Spinner size={48} className={classes.spinner} />)}
<HeaderLine />
<Router>
<Switch>
<Route exact path={APP_AUTH_PATH()} component={SignInScreen} />
<PrivateRoute
path={APP_DASHBOARD_PATH()}
component={DashboardScreen}
authenticationPath={APP_AUTH_PATH()}
/>
<Route
exact
path={APP_LANDING_PATH()}
render={() => <Redirect to={APP_DASHBOARD_PATH()} />}
/>
</Switch>
</Router>
</Fragment>
) : (
<Spinner size={48} className={classes.spinner} />
);
};
export default withStyles(styles)(App);
逻辑或运算符“||”只要第一个条件已经为真,就不会查看第二个条件。
这个组件的逻辑我觉得不错。
- 假设
isReceivedSession
为真,<ReactFragment/>
呈现;如果不是,<Spinner/>
应该呈现 - 在片段中,如果
isLoadingApp || isLoadingAuth
为真,则应呈现<Spinner/>
组件;如果语句不真实,则返回一条线和路由器并渲染。
但即使 isLoadingApp
在控制台中记录为真,微调器也永远不会出现。我只看到一个片段(什么都没有)或预期的线路和路由器导航路径。
当 isLoadingApp
计算结果为真时,微调器组件应该可见。
我觉得我在这里遗漏了更深层次的东西...逻辑上的缺陷在哪里?
const App = ({ classes }: IProps) => {
const dispatch = useDispatch();
const [isReceivedSession, setIsReceivedSession] = useState(false);
const isLoadingAuth: boolean = useSelector(authIsLoadingSelector);
const isLoadingApp: boolean = useSelector(appIsLoadingSelector);
useEffect(() => {
(async () => {
try {
const sessionData = await CognitoClient.currentSession();
const currentSessionToken = sessionData.getAccessToken().getJwtToken();
if (currentSessionToken) {
dispatch(authActions.setAuthStatus(AUTH_STATUS.LOGGED_IN));
}
} finally {
setIsReceivedSession(true);
}
})();
}, []);
//all logging values properly
console.log("isReceivedSession", isReceivedSession);
console.log("isLoadingApp ", isLoadingApp);
console.log("isLoadingAuth ", isLoadingAuth)
return isReceivedSession ? (
//spinner never renders even when isLoadingApp is true
<Fragment>
{isLoadingApp ||
(isLoadingAuth && <Spinner size={48} className={classes.spinner} />)}
<HeaderLine />
<Router>
<Switch>
<Route exact path={APP_AUTH_PATH()} component={SignInScreen} />
<PrivateRoute
path={APP_DASHBOARD_PATH()}
component={DashboardScreen}
authenticationPath={APP_AUTH_PATH()}
/>
<Route
exact
path={APP_LANDING_PATH()}
render={() => <Redirect to={APP_DASHBOARD_PATH()} />}
/>
</Switch>
</Router>
</Fragment>
) : (
<Spinner size={48} className={classes.spinner} />
);
};
export default withStyles(styles)(App);
逻辑或运算符“||”只要第一个条件已经为真,就不会查看第二个条件。