Я хочу проверить параметры в моем компоненте и выполнить перенаправление, если они не передают какую-то логику.
Две вещи могут пойти не так:
Warning: Cannot update a component (`BrowserRouter`) while rendering a different component (`Home`).
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>
);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны разделить логику выдачи преднамеренного побочного эффекта навигации от логики рендеринга действительного 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 navigate не следует вызывать как непреднамеренный побочный эффект непосредственно из тела функции, его следует вызывать из «метода жизненного цикла», также известного как useEffect хук. Имейте в виду, что все тело функции функционального компонента React фактически является «методом рендеринга» и должно рассматриваться как чистая функция.
Спасибо, Дрю 🙏 ... теперь для меня это имеет смысл 😅
navigateвuseEffect, а затем рано вернуться ниже эффекта какif (id < 3) return null