michael_mashush
@michael_mashush

Почему navigate срабатывает в родительском компоненте, но не в дочернем?

1. Хук useRedirectToInitialPage для редиректа на исходную страницу
import React                        from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import useStoreSelector             from 'hooks/store/useStoreSelector'

function useRedirectToInitialPage(): void {

  const userState = useStoreSelector((store) => store.userState)
  const location  = useLocation()
  const navigate  = useNavigate()

  React.useEffect(() => {
    if (userState.isAuthorized && location.state?.from) {
      navigate(location.state?.from)
    }
  }, [userState.isAuthorized]) // eslint-disable-line react-hooks/exhaustive-deps

}

export default useRedirectToInitialPage


2. Компонент App
import React                    from 'react'
import Layout                   from 'components/layout/Layout/Layout'
import AuthManager              from 'utils/components/managers/AuthManager'
import PageManager              from 'utils/components/managers/PageManager'
import useRedirectToInitialPage from 'hooks/auth/useRedirectToInitialPage'

const App: React.FunctionComponent = () => {

  useRedirectToInitialPage()

  return (
    <Layout>
      <AuthManager />
      <PageManager />
    </Layout>
  )

}

export default App


3. Компонент AuthManager
import React                    from 'react'
import Loader                   from 'components/common/feedback/Loader/Loader'
import Window                   from 'components/common/feedback/Window/Window'
import useSubscribeToAuthChange from 'hooks/auth/useSubscribeToAuthChange'
// import useRedirectToInitialPage from 'hooks/auth/useRedirectToInitialPage'

const AuthManager: React.FunctionComponent = () => {

  const subscribing = useSubscribeToAuthChange()

  // useRedirectToInitialPage()

  return (
    <>
      <Loader 
        visible={subscribing.isLoading}
        details="Инициализация"
      />
      <Window
        visible={subscribing.isError}
        variant="message"
        heading="Ошибка"
        details={subscribing.error?.message ?? ''}
        onClose={subscribing.reset}
      />
    </>
  )

}

export default AuthManager


Компонент Layout никак не взаимодействует с redux и просто формирует несколько вложенных div-элементов.

Я не понимаю почему если я использую хук useRedirectToInitialPage внутри компонента AuthManager, функция navigate не срабатывает, хотя userState.isAuthorized равен true и location.state?.from равен исходному адресу.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
Рендеринг компонентов с верху вниз, с начало рендерится у тебя компонент App, а потом его дочерний элемент AuthManager, но так как ты вызываешь useRedirectToInitialPage в App, компонент AuthManager не успевает от рендерится, потому что в App useRedirectToInitialPage редеректит туда, куда ты указал
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы