передавая параметры через this.props.history.push ('/ xyz) в ответном маршрутизаторе [дубликат]

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

35
задан Shubham Khatri 14 November 2017 в 12:02
поделиться

3 ответа

Нет необходимости использовать withRouter. Это работает для меня:

На родительской странице

<BrowserRouter>
   <Switch>
        <Route path="/routeA" render={(props)=> (
          <ComponentA {...props} propDummy={50} />
        )} />

        <Route path="/routeB" render={(props)=> (
          <ComponentB {...props} propWhatever={100} />
          )} /> 
      </Switch>
</BrowserRouter>

Затем в ComponentA или ComponentB вы можете получить доступ к

this.props.history

, включая метод this.props.history.push.

0
ответ дан joedotnot 15 August 2018 в 16:48
поделиться

Добавить информацию для получения параметров запроса.

const queryParams = new URLSearchParams(this.props.location.search);
console.log('assuming query param is id', queryParams.get('id');

Для получения дополнительной информации о URLSearchParams проверьте эту ссылку URLSearchParams

-2
ответ дан kamal pandey 15 August 2018 в 16:48
поделиться
  • 1
    Это не имеет отношения к React Router 4. – Colby Cox 6 February 2018 в 19:48
  • 2
    Может быть, не имеет никакого отношения к чему-либо в этой теме, но заставил меня усмехнуться. – TGarrett 15 May 2018 в 20:21

Прежде всего, вам не нужно делать var r = this;, поскольку это в if statement относится к контексту самого обратного вызова, который, поскольку вы используете функцию стрелки, ссылается на контекст компонента React.

к документам:

объекты истории обычно имеют следующие свойства и методы:

  • length - (number) Число записей в стеке истории
  • action - (string) Текущее действие (PUSH, REPLACE или POP)
  • location - (object) Текущее местоположение. Может иметь следующие свойства: pathname - (string) Путь поиска по URL - (строка) Строка запроса URL-адреса hash - (строка) Состояние хэш-фрагмента URL-адреса (строка), определяющее местоположение, которое было предоставлено, например, push (путь, состояние), когда это место было перенесено в стек. Доступно только в истории браузера и памяти.
  • push (путь, [состояние]) - (функция) Вставляет новую запись в стек истории
  • replace (путь, [состояние]) - (функция) Заменяет текущую запись на стек истории
  • go (n) - (функция) Перемещает указатель в стек истории на n записей
  • goBack () - (функция) Эквивалент go (-1)
  • goForward () - (функция) Эквивалент go (1)
  • block (prompt) - (функция) Предотвращает навигация

Таким образом, во время навигации вы можете передать реквизит для объекта истории, например

this.props.history.push({
  pathname: '/template',
  search: '?query=abc',
  state: { detail: response.data }
})

или аналогично для компонента связи

<Link to={{
      pathname: '/template',
      search: '?query=abc',
      state: { detail: response.data }
    }}> My Link </Link>

, а затем в компоненте, который отображается с помощью /template, вы можете получить доступ к реквизитам, переданным как

this.props.location.state.detail

Также имейте в виду, что при использовании объектов истории или местоположения из реквизита вам необходимо подключить компонент с помощью withRouter.

В соответствии с Документами:

withRouter

Вы можете получить доступ к свойствам объекта истории и ближайшему совпадению <Route>'s через withRouter h компонент более высокого порядка. withRouter будет повторно отображать свой компонент каждый раз, когда маршрут изменяется с теми же реквизитами, что и <Route> render props: { match, location, history }.

90
ответ дан Shubham Khatri 15 August 2018 в 16:48
поделиться
Другие вопросы по тегам:

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