Skip to content
Главы

🧭 Навигация

Императивная навигация из любой точки проекта

Входные данные: наличие react-router v5

Если требуется завязать effector-логику на переходах по страницам (будь то переход на главную страницу после успешной регистрации, переход на главную страницу после успешного действия или любой другой кейс), то ниже приведен пример враппера, который подписывает события из @/app на работу вместе с history:

@/features/app/model/public.ts

ts
import { d } from './domain'

export const pushNavigate = d.event<string>()
export const goBackNavigate = d.event<void>()
export const replaceNavigate = d.event<string>()

RouterNavigator.tsx

tsx
import React from 'react'

import { useHistory } from 'react-router-dom'

import {
  pushNavigate,
  replaceNavigate,
  goBackNavigate,
} from '@/features/app/model'

export const RouterNavigator = () => {
  const history = useHistory()

  React.useEffect(() => {
    const unwatchPush = pushNavigate.watch((url) => history.push(url))
    const unwatchReplace = replaceNavigate.watch((url) => history.replace(url))
    const unwatchGoBack = goBackNavigate.watch(() => history.goBack())
    return () => {
      unwatchPush()
      unwatchGoBack()
      unwatchReplace()
    }
  }, [history])

  return null
}

@/src/Routes.tsx

tsx

export const Routes = () => {


    return (
        <BrowserRouter>
            <RouterNavigator />
            <Switch>
                {...}
            </Switch>
        </BrowserRouter>

    )
}

Применение

Ниже приведены примеры применения императивного перехода:

ts
sample({
  clock: logout,
  target: pushNavigate,
  fn: () => '/',
})

sample({
  clock: fetchAuthDataFx.doneData,
  filter: $isRegisterIncomplete,
  fn: () => `/register`,
  target: pushNavigate,
})

42px Company