Как я могу перезагрузить компонент React на основе URL-адреса, установленного родственным компонентом?

У меня есть компонент 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.

Можем ли мы увидеть, как вы пытаетесь прочитать это в своем компоненте поиска, я имею в виду код компонента поиска?

Praveen Rao Chavan.G 30.07.2018 12:06

@ PraveenRaoChavan.G Обновил мой вопрос кодом поискового компонента.

MiniGunnR 30.07.2018 12:09

Можете ли вы выполнить отладку, чтобы увидеть, поступает ли элемент управления в componentDidUpdate?

Praveen Rao Chavan.G 30.07.2018 12:22

Оно делает. Я записал в консоль текст, и он отображается всякий раз, когда я что-то ищу. Но компонент не обновляется.

MiniGunnR 30.07.2018 12:31

Проверяли ли вы в инструментах разработчика React, есть ли в состоянии компонента поиска новые данные?

Praveen Rao Chavan.G 30.07.2018 12:33

Когда я выполняю поиск с другого URL-адреса, он получает данные и показывает их, но последующие поиски со страницы результатов поиска не получают новых данных.

MiniGunnR 30.07.2018 12:35

this.state.submit, где вы устанавливаете значение true? Я не вижу этого нигде в коде.

Praveen Rao Chavan.G 30.07.2018 12:38

Почему я спрашиваю об этом, потому что в componentDidUpdate вы проверяете, так ли (this.state.submit) ..

Praveen Rao Chavan.G 30.07.2018 12:39

Когда я выполнял поиск изнутри компонента поиска, я устанавливал для submit значение true в функции handleSubmit всякий раз, когда пользователь хотел выполнить поиск. После завершения поиска я установил для него значение false, как вы можете видеть из предоставленного мной кода. Поскольку сейчас я ищу в другом компоненте, думаю, мне нужен способ установить для него значение true. Что мне делать в таком случае?

MiniGunnR 30.07.2018 12:40

Просто для проверки и подтверждения установите для параметра submit значение true и проверьте, работает ли оно.

Praveen Rao Chavan.G 30.07.2018 12:48

или просто снимите чек для быстрого подтверждения.

Praveen Rao Chavan.G 30.07.2018 12:48
Поведение ключевого слова "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
11
176
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это происходит потому, что в вашем componentDidUpdate вы проверяете наличие this.state.submit, которое является ложным, поэтому он не работает

Поскольку теперь вы находитесь в другом компоненте, вам нужно найти способ установить эту отправку в своем состоянии.

Решение:

Переместите все свое состояние и обработчик handleClick() из Заголовок в Компонент MainWrapper. Затем передайте значения в качестве свойств всем компонентам, которые должны использовать эту функциональность.

Таким образом, вы можете установить представить в своем состоянии компонента MainWrapper, а также получить к нему доступ в своем дочернем компоненте через props.

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

superhawk610 30.07.2018 13:10

Я использую реагирующий маршрутизатор v4 и не понимаю, как передавать реквизиты компоненту Search, когда мой код похож на этот <Route path = {`/search`} component = {Search} />.

MiniGunnR 30.07.2018 13:12

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

Praveen Rao Chavan.G 30.07.2018 13:23

Пожалуйста, не стесняйтесь спрашивать, если вы все еще не поняли, о чем я говорю.

Praveen Rao Chavan.G 30.07.2018 13:24

Я не понял, брат. Если я не использую <Search prop1=func1 prop2=func2 />, как я буду использовать эти функции внутри компонента Search?

MiniGunnR 30.07.2018 13:28

пожалуйста, проверьте это tylermcginnis.com/react-router-pass-props-to-components

Praveen Rao Chavan.G 30.07.2018 13:34

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