Поскольку вы использовали history.pu sh на handleClick, вы увидите несколько запросов, отправляемых при использовании history.pu sh на обработчике кликов, что вызовет повторный рендеринг и позволит использовать произвольно сгенерированный URL как а также вызвать функцию fetchTodo.
Теперь произойдет повторный рендеринг, который приведет к генерации случайного идентификатора. и передается на ловушку useTodo, которая приведет к повторному вызову функции fetchTodo.
Правильное решение для вас - установить параметр random todo id на handleClick, а также избежать ненужных обновлений URL
const Todos = () => {
const history = useHistory();
const { id: todoId } = useParams();
const { fetchTodo, todo, isFetching, error } = useTodo(todoId);
const isInitialRender = useRef(true);
const handleClick = () => {
const todoId = randomMax(100);
history.push(`/${todoId}`);
};
useEffect(() => {
history.push(`/${todoId}`);
}, []);
useEffect(() => {
if(!isInitialRender.current) {
fetchTodo();
} else {
isInitialRender.current = false
}
}, [todoId])
return (
<>
<button onClick={handleClick} style={{marginBottom: "10px"}}>Fetch a todo</button>
{isFetching ? (
<p>Fetching...</p>
) : (
<Todo todo={todo} color={todo.color} isFetching={isFetching} />
)
}
</>
);
};
export default Todos;
Рабочая демоверсия