React router history.push не добавляет путь от корня?

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

Путь к странице сведений о моем продукте имеет следующую структуру:

<Route extact path = {'/:category/:id'} component = {ProductDetailContainer}/>

В моем автозаполнении у меня есть функция onChange, которая запускает перенаправление.

const handleChangeEvent(event, value) => {
   history.push(`${value.category}/${value.id}`) 
}

Хотя это работает, когда пользователь находится в базовом URL-пути '/', произойдет сбой, если пользователь попытается использовать поле автозаполнения в ProductDetailContainer из-за того, что путь был снова добавлен поверх текущего пути, тогда он станет таким путем, как этот '/:PrevCategory/:NewCategory/:id'

Я пытался использовать replace, но, похоже, он делает то же самое. Итак, есть ли способ сбросить историю до базового URL-адреса перед push()?

# Редактировать 1 Это где поле для автозаполнения и история являются толчком.

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

import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import IconButton from '@material-ui/core/IconButton';
import Typography from '@material-ui/core/Typography';
import { fade, makeStyles } from '@material-ui/core/styles';
import MenuIcon from '@material-ui/icons/Menu';

import TextField from '@material-ui/core/TextField'
import CircularProgress from '@material-ui/core/CircularProgress'
import Autocomplete from '@material-ui/lab/Autocomplete'

const useStyles = makeStyles((theme) => ({
....
}));

const TitleBar = () => {
  const classes = useStyles();
  const history = useHistory();
  const [open, setOpen] = React.useState(false);
  const [options, setOptions] = React.useState([]);
  const loading = open && options.length === 0;

  React.useEffect(() => {
    let active = true;

    if (!loading) {
      return undefined
    }

    (async () => {
      const response = await fetch(site)

      const products = await response.json();
      
      if (active){
        setOptions(products)
      }

    })();

    return () => {
      active = false;
    };

  }, [loading])

  React.useEffect(() => {
    if (!open) {
      setOptions([]);
    }
  }, [open])

  const handleChangeEvent = (event, value) => {
    if (value !== null) {
      // redirect to product detail page if user selected an item
      history.replace(`${value.category}/${value.id}`)
    }
  }

  return (
    <div className = {classes.root}>
      <AppBar position = "static">
        <Toolbar>
          <IconButton
            edge = "start"
            className = {classes.menuButton}
            color = "inherit"
            aria-label = "open drawer"
          >
            <MenuIcon />
          </IconButton>

          <div className = {classes.search}>

            <Autocomplete
              id='aysncSearchBar'
              style = {{ width : 300}}
              open = {open}
              onOpen = {()=>{setOpen(true)}}
              onClose = {()=>{setOpen(false)}}
              getOptionSelected = {(option, value) => option.id = value.id}
              getOptionLabel = {(option) => option.title}
              options = {options.sort((a,b) => -b.category.localeCompare(a.category))}
              groupBy = {(option) => option.category}
              loading = {loading}
              onChange = {handleChangeEvent}
              renderInput = {(params) => (
                <TextField 
                  {...params}
                  label = "Search"  
                  variant = "outlined"
                  InputProps = {{
                    ...params.InputProps,
                    endAdornment: (
                      <React.Fragment>
                        {loading ? <CircularProgress color = "inherit" size = {20} /> : null}
                        {params.InputProps.endAdornment}
                      </React.Fragment>
                    ),
                  }}
                />
              )}

            />
          </div>

        </Toolbar>
      </AppBar>
    </div>
  );
}

export default TitleBar;

Как вы получаете свой объект истории?

MetallimaX 18.12.2020 12:36

постоянная история = useHistory(); если это то, о чем вы спрашиваете. Я следовал инструкциям с сайта React Router reactrouter.com/web/api/Hooks/usehistory

user2232355 18.12.2020 12:39

Хотелось бы увидеть и ваш компонент с JSX. Отредактируйте вопрос, чтобы включить оба :)

Imran Rafiq Rather 18.12.2020 12:42

хм, отлично. Дай мне посмотреть, что происходит. Надеюсь на лучшего друга :)

Imran Rafiq Rather 18.12.2020 12:48

Конечно, добавленный компонент.

user2232355 18.12.2020 12:48

Вы должны определить базовый путь приложения в файле env и использовать его в методе push истории, если вы хотите, чтобы поведение вам нужно @user2232355

Sudhanshu Kumar 18.12.2020 12:54
Поведение ключевого слова "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
6
2 276
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам не хватает базы / при нажатии.. если у вас нет базы /, она будет продолжать добавлять.

history.push(`/${value.category}/${value.id}`)

о ничего себе, я не могу поверить, что я пропустил эту часть. Ценю вашу помощь !

user2232355 18.12.2020 13:27

Рад, что смог вам помочь :) Пожалуйста, не забудьте проголосовать :)

Nilesh Patel 18.12.2020 13:31

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