У меня есть компонент Main, содержащий следующий код, и он отлично работает.
<Switch>
<Route path='/compare' component = {Compare} />
<Route exact path='/' component = {Home} />
<Route path = {`/search`} component = {Search} />
<Route path = {`/:vehicleId`} component = {VehicleDetail} />
</Switch>
Компонент Search, который вы видите выше, имеет поле ввода поиска, которое при использовании показывает результат поиска. Я хочу получить поле поиска из компонента «Поиск» и разместить его на панели навигации, но при этом отображать результат в компоненте «Поиск» при поиске с панели навигации. Вот как выглядит мой App.js.
<div>
<Navbar/> <-- search box is here now
<Main/> <-- I have to show the result in here now, inside Search component
<Footer/>
</div>
Я пытаюсь установить URL-адрес из компонента Navbar с помощью следующего кода, и он отлично работает.
this.props.history.push(`/search?q=${query}`)
Однако обновляется только URL-адрес, но компонент Search не выполняет повторную визуализацию, когда я уже нахожусь на странице поиска. Другими словами, я могу загрузить компонент поиска, когда ищу с другого URL-адреса, но как только я попадаю в domain.com/search?q=mercedes, я не вижу повторного рендеринга результата поиска, если я ищу, скажем, peugeot, который обновляет URL-адрес на domain.com/search?q=peugeot, но все же показывает результаты последнего поиска, то есть mercedes.
Как я могу повторно отрендерить компонент Search?
Дополнительная информация Код компонента поиска выглядит следующим образом:
state = {
query : (new URL(document.location)).searchParams.get('q'),
submit : false,
result : []
}
componentDidUpdate() {
if (this.state.submit) {
let url = `${data.api}api/all/?search=${this.state.query}`
fetch(url)
.then(response => response.json())
.then(data => {
this.setState({
result : data
})
})
this.setState({ submit : false })
}
}
componentDidMount() {
let url = `${data.api}api/all/?search=${this.state.query}`
fetch(url)
.then(response => response.json())
.then(data => {
this.setState({
result : data
})
})
}
Это отлично работает, поскольку поле поиска находится в компоненте поиска. Однако этот код не работает, когда я выполняю history.push и обновляю URL-адрес из родственного компонента Navbar.
@ PraveenRaoChavan.G Обновил мой вопрос кодом поискового компонента.
Можете ли вы выполнить отладку, чтобы увидеть, поступает ли элемент управления в componentDidUpdate?
Оно делает. Я записал в консоль текст, и он отображается всякий раз, когда я что-то ищу. Но компонент не обновляется.
Проверяли ли вы в инструментах разработчика React, есть ли в состоянии компонента поиска новые данные?
Когда я выполняю поиск с другого URL-адреса, он получает данные и показывает их, но последующие поиски со страницы результатов поиска не получают новых данных.
this.state.submit, где вы устанавливаете значение true? Я не вижу этого нигде в коде.
Почему я спрашиваю об этом, потому что в componentDidUpdate вы проверяете, так ли (this.state.submit) ..
Когда я выполнял поиск изнутри компонента поиска, я устанавливал для submit значение true в функции handleSubmit всякий раз, когда пользователь хотел выполнить поиск. После завершения поиска я установил для него значение false, как вы можете видеть из предоставленного мной кода. Поскольку сейчас я ищу в другом компоненте, думаю, мне нужен способ установить для него значение true. Что мне делать в таком случае?
Просто для проверки и подтверждения установите для параметра submit значение true и проверьте, работает ли оно.
или просто снимите чек для быстрого подтверждения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это происходит потому, что в вашем componentDidUpdate вы проверяете наличие this.state.submit, которое является ложным, поэтому он не работает
Поскольку теперь вы находитесь в другом компоненте, вам нужно найти способ установить эту отправку в своем состоянии.
Решение:
Переместите все свое состояние и обработчик handleClick() из Заголовок в Компонент MainWrapper.
Затем передайте значения в качестве свойств всем компонентам, которые должны использовать эту функциональность.
Таким образом, вы можете установить представить в своем состоянии компонента MainWrapper, а также получить к нему доступ в своем дочернем компоненте через props.
Да, если вы когда-нибудь обнаружите, что пытаетесь общаться между братьями и сестрами, вам, вероятно, придется поднять логику на более высокий уровень и передать ее как опору.
Я использую реагирующий маршрутизатор v4 и не понимаю, как передавать реквизиты компоненту Search, когда мой код похож на этот <Route path = {`/search`} component = {Search} />.
Почему нужно переходить на Route? нет, я думаю, вы не поняли, маршрутизация здесь не при чем, все дело в перемещении состояния и обработчика в компоненты оболочки и последующей передаче обработчика.
Пожалуйста, не стесняйтесь спрашивать, если вы все еще не поняли, о чем я говорю.
Я не понял, брат. Если я не использую <Search prop1=func1 prop2=func2 />, как я буду использовать эти функции внутри компонента Search?
пожалуйста, проверьте это tylermcginnis.com/react-router-pass-props-to-components
Можем ли мы увидеть, как вы пытаетесь прочитать это в своем компоненте поиска, я имею в виду код компонента поиска?