Проверьте параметры, затем перейдите с помощью React Router v6

Я хочу проверить параметры в моем компоненте и выполнить перенаправление, если они не передают какую-то логику.

Две вещи могут пойти не так:

  1. React выдает мне предупреждение о рендеринге:
Warning: Cannot update a component (`BrowserRouter`) while rendering a different component (`Home`).
  1. При обновлении страницы напрямую с неверным параметром я получаю предупреждение:
You should call navigate() in a React.useEffect(), not when your component is first rendered.

Я не уверен, что понимаю, почему я не могу return null или вернуть любой случайный элемент из логики и при этом правильно перенаправить его.

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

Смотрите коды и ящик здесь (вам нужно изменить URL-адрес, чтобы добавить идентификационный номер): https://codesandbox.io/s/nostalgic-cloud-di0ovf

import "./styles.css";
import {
  BrowserRouter,
  Routes,
  Route,
  Link,
  useNavigate,
  useParams,
} from "react-router-dom";

export default function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path = "/:id" element = {<Home />} />
        <Route path = "/users" element = {<Users />} />
      </Routes>
    </BrowserRouter>
  );
}

function Users() {
  return (
    <div>
      <nav>
        <Link to = "/1">Go To 1 (bad param)</Link>
      </nav>
      <h2>Users</h2>
    </div>
  );
}

function Home() {
  const navigate = useNavigate();

  const {id} = useParams();
  
  // check for properly formed params
  if ( id < 3){
    navigate({pathname:'/users', replace:true})
    return <span>nothing</span>;
  }

  // other logic that depends on properly formed params
  // don't run this with mal-formed params!

  return (
    <div>
      <nav>
        <Link to = "/1">Go To 1 (bad param)</Link>
      </nav>
      <h1>Home: {id}</h1>
    </div>
  );
}
navigate в useEffect, а затем рано вернуться ниже эффекта как if (id < 3) return null
KcH 29.09.2022 09:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
303
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны разделить логику выдачи преднамеренного побочного эффекта навигации от логики рендеринга действительного JSX.

Пример:

function Home() {
  const navigate = useNavigate();
  const { id } = useParams();

  useEffect(() => {
    if (id < 3) {
      navigate('/users', { replace: true });
    }
  }, [id, navigate]);
  
  // check for properly formed params
  if (id < 3) {
    return <span>nothing</span>; // or null
  }

  // other logic that depends on properly formed params
  // don't run this with mal-formed params!

  return (
    <div>
      <nav>
        <Link to = "/1">Go To 1 (bad param)</Link>
      </nav>
      <h1>Home: {id}</h1>
    </div>
  );
}

В качестве альтернативы вы можете вместо этого отобразить декларативное перенаправление.

Пример:

function Home() {
  const { id } = useParams();

  // check for properly formed params
  if (id < 3) {
    return <Navigate to='/users' replace />;
  }

  // other logic that depends on properly formed params
  // don't run this with mal-formed params!

  return (
    <div>
      <nav>
        <Link to = "/1">Go To 1 (bad param)</Link>
      </nav>
      <h1>Home: {id}</h1>
    </div>
  );
}

Привет, Дрю, You should call navigate() in a React.useEffect(), not when your component is first rendered. в чем смысл этого предупреждения и как оно действует?

KcH 29.09.2022 09:46

@KcH navigate не следует вызывать как непреднамеренный побочный эффект непосредственно из тела функции, его следует вызывать из «метода жизненного цикла», также известного как useEffect хук. Имейте в виду, что все тело функции функционального компонента React фактически является «методом рендеринга» и должно рассматриваться как чистая функция.

Drew Reese 29.09.2022 09:49

Спасибо, Дрю 🙏 ... теперь для меня это имеет смысл 😅

KcH 29.09.2022 09:56

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

Похожие вопросы