Как предотвратить перезагрузку текущей страницы и перейти на домашнюю страницу в React?

Я хочу перенаправить на домашнюю страницу с каждой страницы моего приложения. Поэтому я добавляю следующий код:

<Switch>
    <Route path = "/login" component = {Login} />
    <Route path = "/otp" component = {Otp} />
    <Layout>
      <Suspense fallback = {<LayoutSplashScreen />}>
        <Redirect push to = "/homePage" />
        <ContentRoute
          path = "/homePage"
          component = {RequestTabel}
          children = {undefined}
          render = {undefined}
        />
        <ContentRoute
          path = "/Register"
          component = {RegisterPage}
          children = {undefined}
          render = {undefined}
        />
         .
         .
         .
   </Layout>
</Switch>

Теперь, когда я обновляю каждую страницу, я перехожу на домашнюю страницу, но текущая страница перезагружается, и после этого приложение переходит на домашнюю страницу. Я не знаю, почему, и я хочу проверить это. Я много искал и могу найти ссылку ниже, но мне нужно добавить ее на все мои страницы в приложении, и я думаю, что это неправильное решение.

if (performance.navigation.type === 1) {
// page was just refreshed:

window.location.href = '/homePage';
}

Я добавляю другие части связанного кода к моему вопросу:

маршруты.tsx

export default function Routes() {
 return ( 
    <Switch>
       <HashRouter>
          <BasePage />
       </HashRouter>
    </Switch>
  );
}

BasePage — это приведенный выше код, который я написал первым.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
172
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш макет просто существует, каждый раз вызывая Redirect. Я не уверен, какую библиотеку маршрутизации вы используете. Если это react-router-dom, взгляните на их документацию по маршрутизации макетов. TL; DR (хотя вы обязательно должны прочитать) заключается в том, что все в маршрутизаторе должно быть внутри Route, у вас не может быть таких бесплатных вещей. Если это какая-то другая библиотека, например TanStack Router, попробуйте найти их определение маршрутизации.

В нынешнем виде ваш компонент Redirect всегда вызывается, поэтому вас всегда перенаправляют. Это должно быть обусловлено в маршруте.

Спасибо @Ронни Эфрони. Я думаю, вы не можете понять мой вопрос. Я хочу перенаправить на домашнюю страницу, и он делает это правильно, но перед перенаправлением на домашнюю страницу перезагрузите текущую страницу, и я не знаю, почему текущая страница сначала перезагружается, а затем переходит на домашнюю страницу.

change world 04.04.2023 13:32

Я не понимаю, что здесь означает перезарядка. Вы либо загружаете текущую страницу, либо перенаправляете с нее, у вас не может быть и того, и другого, одновременно может быть активной только одна страница. Возможно, если бы вы добавили в вопрос больше деталей, например, какую библиотеку вы используете и что должно вызывать перенаправление, это было бы полезно.

Ronny Efronny 04.04.2023 17:24

Я использовал библиотеку react-router-dom. reload означает, что пользователь нажимает F5 в браузере и хочет перезагрузить страницу. В этой ситуации я хочу перейти на домашнюю страницу, а не перезагрузить текущую страницу. но в моем коде текущая страница перезагружается и снова монтируется, а после этого переходит на домашнюю страницу. но я не знаю почему

change world 05.04.2023 06:14

@changeworld Теперь я понимаю, что ты имеешь в виду. В вашем useEffect у вас есть «домашняя страница» с ошибкой, вы используете «домашнюю страницу» везде. Может ли это быть проблемой? Если нет, попробуйте вместо этого использовать useLayoutEffect.

Ronny Efronny 09.04.2023 11:34
Ответ принят как подходящий

Код безоговорочно отображает компонент Redirect. Если вы хотите, чтобы "/homepage" был своего рода маршрутом «по умолчанию», то вложенные маршруты внутри Layout/Suspense также должны быть обернуты в Switch (внешний Switch уже будет сопоставляться и рендериться Layout), а Redirect переместить в конец Switch в качестве универсального маршрута для перенаправления пользователей на "/homepage", если они не пытались получить доступ к какому-либо другому маршруту.

Пример:

<Switch>
  <Route path = "/login" component = {Login} />
  <Route path = "/otp" component = {Otp} />
  <Layout>
    <Suspense fallback = {<LayoutSplashScreen />}>
      <Switch>
        <ContentRoute path = "/homePage" component = {RequestTabel} />
        <ContentRoute path = "/Register" component = {RegisterPage} />
          ...
          ...
          ...
        <Redirect push to = "/homePage" />
      </Switch>
    </Suspense>
  </Layout>
</Switch>

Если вы хотите, чтобы приложение перенаправляло на "/homepage" при монтировании, добавьте хук useEffect к первому компоненту под маршрутизатором и выполните императивное перенаправление.

Пример:

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

const App = () => {
  const history = useHistory();

  React.useEffect(() => {
    history.replace("/homepage");
  }, []);

  ... rest of the component code
};
<BrowserRouter>
  <App />
</BrowserRouter>

Спасибо @Drew Reese, но с вашим кодом приложение не переходит на домашнюю страницу при перезагрузке каждой страницы. Я хочу перейти на домашнюю страницу вместо перезагрузки текущей страницы. но в моем коде текущая страница перезагружается и снова монтируется, а после этого переходит на домашнюю страницу. но я не знаю почему. Извините, если мой английский слаб и, возможно, я не могу донести свою точку зрения.

change world 05.04.2023 06:17

@changeworld Можете ли вы уточнить, что вы подразумеваете под «приложение не переходит на домашнюю страницу при перезагрузке каждой страницы»? Вы говорите, что если вы переходите к "/homepage" или любому другому пути, у вас нет маршрута, для которого компонент RequestTabel не отображается? Какое отношение загрузка/перезагрузка страницы имеет к отображению домашней страницы? Возможно, мы не понимаем вашу проблему или вариант использования. Пожалуйста, попробуйте уточнить.

Drew Reese 05.04.2023 07:05

@changeworld Хорошо, я прочитал ваш комментарий к другому ответу. Что именно делает ваш код, который перенаправляет на домашнюю страницу? Пожалуйста, отредактируйте свой пост и предоставьте более полный минимально воспроизводимый пример, который включает корневое приложение и маршрутизатор, маршруты, код компонента, выполняющий перенаправление, и любой соответствующий код между ними, который может иметь отношение к проблеме/вопросу.

Drew Reese 05.04.2023 07:06

Спасибо @Дрю Риз. У меня есть приведенный выше код в basePage, и у меня нет других кодов для обработки перенаправления на домашнюю страницу. Итак, теперь, когда я нажимаю F5, приложение перезагружает текущую страницу (например, страницу A, с помощью отладчика я сначала вижу начальную страницу A), а затем, закончив ее, переходит на домашнюю страницу.

change world 05.04.2023 07:22

@changeworld Если у вас нет другого кода для обработки перенаправления на домашнюю страницу, то что же делает переход на домашнюю страницу при загрузке/перезагрузке приложения? Что такое basePage или pageA?

Drew Reese 05.04.2023 07:27

Я добавил к моему вопросу другие части связанного кода. basePage управляет маршрутизацией между компонентами. pageA означает что-то вроде Register page или что-то в этом роде. Это всего лишь пример. и <Redirect to = "/homePage" /> над Layout дескриптором для перенаправления на homePage

change world 05.04.2023 07:39

@changeworld До сих пор неясно, что и где делает ваш код, но я обновил свой ответ, указав, что я предлагаю делать, если вы хотите выполнить действие перенаправления при монтировании кода приложения.

Drew Reese 05.04.2023 07:44

Другие вопросы по теме