реагировать на дублированные параметры маршрутизатора URL - PullRequest
0 голосов
/ 30 сентября 2019

Я знаю, что эта проблема связана с фундаментальным неправильным пониманием того, как работает React Router, и, более конкретно, вероятно, с объектом истории. У меня есть компонент под названием Поиск, который позволяет пользователю искать определенный город. Этот компонент появляется в разных местах приложения, включая «/» и «/:cityname».

Из «/», компонент работает, как и ожидалось, и корректно выдвигает новый параметр url на URL иURL становится '/ Ванкувер'. Тем не менее, из '/ Ванкувер', когда я использую этот же компонент, URL-адрес не работает, как ожидалось. Например, если я вхожу в Стамбул, меня правильно направляют в / istanbul, но затем, когда я прохожу приложение и нажимаю на элементы, я ожидаю, что меня направят в '/ istanbul / item1'. Однако в настоящее время происходит то, что я оказываюсь в '/ istanbul / istanbul / item1', который, конечно, не найден, и возвращает 404.

Вот функция, которая вызывается при выборе города(находится в компоненте поиска)

    const onSuggestionSelected = (event, { suggestion }) => {
        props.history.push(`/${suggestion.nickname}`)
    }

App.js с маршрутами

 <Switch>
            <Route exact path="/" component={HomePage} />
            <Route exact path="/terms-of-service" component={TermsOfServicePage} />
            <Route exact path="/privacy-policy" component={PrivacyPolicyPage} />
            <Route exact path="/:cityname/personalize" component={FilterPage} />
            <Route exact path="/:cityname/experiences" component={SearchPage}>
              <Redirect to="/:cityname" />
            </Route>
            <Route exact path="/:cityname" component={SearchPage} />
            <Route exact path="/:cityname/experiences/:experiencename" component={ExperiencePage} />
            <Route exact path="/:cityname/experiences/:experiencename/summary" component={(routeProps) => <SummaryPage {...routeProps} />} />
            <Route exact path="/:cityname/experiences/:experiencename/payment" component={PaymentPage} />
            <Route exact path="/:cityname/experiences/:experiencename/payment-successful" component={PaymentSuccessfulPage} />
            <Route component={NotFoundPage} />
            <GlobalStyle />
  </Switch>

Кнопка ExploreMore

                <ButtonWrapper onClick={sendAnalyticsData}>
                    <LetsGoButton to={{
                        pathname: `${props.match.params.cityname}/experiences/${experience.nickname}`,
                        state: props.location.state
                    }}
                    palette="tertiary">
                        Explore more
                    </LetsGoButton>
                </ButtonWrapper>

Пожалуйста, дайте мне знать, если есть что-то еще, чтоЯ могу представить, что было бы полезно. Я пытался исследовать, как работает history.push, но мне не удалось найти много. Я предпочитаю, что он берет текущее местоположение и добавляет указанный URL. Даже если это так, я не могу понять, почему он будет применять Стамбул дважды.

enter image description here

1 Ответ

1 голос
/ 02 октября 2019

Я понял проблему на этом. Один из комментаторов предположил, что я использовал относительные пути, а не абсолютные. Я ошибочно думал, что он был не прав, видя, что у меня там, кажется, есть полный URL. Моя ошибка состояла в том, что я не начинал URL с /

до: ${props.match.params.cityname}/experiences/${experience.nickname}

после: /${props.match.params.cityname}/experiences/${experience.nickname}

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...