Строки в 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 в коде. В противном случае вы столкнетесь с ошибками.
Нет необходимости использовать 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
blockquote>, включая метод this.props.history.push.
Добавить информацию для получения параметров запроса.
const queryParams = new URLSearchParams(this.props.location.search);
console.log('assuming query param is id', queryParams.get('id');
Для получения дополнительной информации о URLSearchParams проверьте эту ссылку URLSearchParams
Прежде всего, вам не нужно делать var r = this;
, поскольку это в if statement
относится к контексту самого обратного вызова, который, поскольку вы используете функцию стрелки, ссылается на контекст компонента React.
к документам:
объекты истории обычно имеют следующие свойства и методы:
blockquote>
- 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
Вы можете получить доступ к свойствам объекта истории и ближайшему совпадению
blockquote><Route>'s
черезwithRouter
h компонент более высокого порядка.withRouter
будет повторно отображать свой компонент каждый раз, когда маршрут изменяется с теми же реквизитами, что и<Route>
renderprops: { match, location, history }
.