Router Issue
Как упомянуто в этом потоке , вложенные компоненты Коммутатора - это не тот способ, которым был разработан реагирующий маршрутизатор, и его, вероятно, следует избегать.
Я думаю, вы здесь слишком усложнили компонент приложения. Я бы порекомендовал что-то более похожее на приведенный ниже пример, потому что вашей логике маршрутизации c не нужно заботиться об аутентификации. Вы можете обернуть компонент Timeline компонентом Auth внутри реализации Timeline , и тогда маршрутизатор просто выполнит маршрутизацию, ничего больше.
function App() {
return (
<Provider store={store}>
<BrowserRouter>
<div>
<Switch>
<Route path="/timeline" component={Timeline} />
<Route path="/" component={Home} />
</Switch>
</div>
</BrowserRouter>
</Provider>
);
}
export default App;
Альтернатива, как упомянуто в ссылка выше, это написать свой собственный Switch logi c. Это может позволить вам сохранять все аутентифицированные маршруты видимыми заранее, но вы, возможно, не захотите возиться с этим.
Вам необходимо состояние аутентификации
Как затронуто в ответе Сороу sh у вас также есть проблема с управлением состоянием в компоненте Auth. На данный момент это выглядит так:
- Компонент отображается с user = false
- Компонент перенаправления отображается, и страница перенаправляется на '/'
Видите ли вы, как никогда нет возможности правильно отрисовать дочерний элемент auth для аутентифицированного пользователя, потому что первоначальный рендеринг всегда будет вызывать перенаправление? Firebase никогда не имеет возможности войти в систему пользователя до того, как он будет перенаправлен.
Чтобы это исправить, вы авторизуетесь, чтобы загрузить страницу в какое-то состояние «аутентификации» и перенаправить пользователя только после того, как узнаете, вошли или нет. Помните, что onAuthStateChanged будет запускаться только после первоначального рендеринга .
Удачи!