React router componentDidMount не выполняется после переключения маршрута

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

Есть ли способ заставить componentDidMount запускаться, когда метод рендеринга, возможно, завершится.

Извините, если это рассматривается как повторяющийся вопрос, но ничто из того, что я видел, не помогло мне понять, как решить эту проблему.

componentDidMount = async () => {
    //initialize web3
    const web3 = await getWeb3();

    // get contract address
    const ethAddress = await storehash.options.address
    this.setState({ethAddress})

    //set account for Blockchain network
    this.setState({account: await web3.eth.getAccounts()})
    }

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

AlexZvl 24.03.2019 19:44

Кроме того, если вы выполняете одну и ту же инициализацию для нескольких компонентов, вы можете переместить ее в родительский элемент и передать через реквизиты или переместить логику в Компонент высшего порядка.

xDreamCoding 24.03.2019 19:51

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

Hend El-Sahli 24.03.2019 20:11

Я не отправляю никаких реквизитов на эту новую страницу, я просто хочу запустить какой-то код, когда этот новый маршрут загружается

Neil Grogan 24.03.2019 20:49

вы переходите по адресу, который соответствует одному и тому же Route, но имеет разные параметры, верно?

skyboyer 25.03.2019 01:23

ты это исправил? можешь опубликовать ответ?

Walls 10.06.2020 14:43

Вы можете использовать компонентWillReceiveProps для этого

Pablo Salazar 22.06.2020 17:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
7
2 776
1

Ответы 1

tl; dr — только компоненты, визуализированные Route (и их дочерние элементы), будут повторно отображаться при изменении маршрута.

Я собираюсь сделать несколько предположений. Во-первых, componentDidMount, который вы пытаетесь использовать, находится в компоненте, который является нет дочерним элементом одного из ваших компонентов маршрута.

Второе предположение, которое я сделаю, заключается в том, что вам нужно запускать не при монтировании компонента это, а при монтировании одного из компонентов новых маршрутов.

Функция componentDidMount в компоненте, который визуализируется маршрутом, вероятно, там, где вам нужно. Однако, если вам нужно что-то обновить в состоянии этого компонента при монтировании одного из его дочерних элементов, это не поможет. Однако вы можете сделать это несколькими разными способами.

Быстро и грязноНе привыкайте делать это

Если вы просто что-то тестируете, быстрый и грязный метод — использовать свойство render маршрута вместо component.

Так, например, если ваш маршрут выглядит так:

<Route path = "/some-route" component = {NewComponent} />

Вы можете изменить это (опять же... только для быстрого теста, не рекомендуется использовать это в любом производственном коде!)

<Route path = "/some-route" render = {(props) => {
    //do your console log or temporary testing stuff here
    return <NewComponent ...props />
}} />

Передайте функцию, которая будет передавать vars от ребенка

Менее грязный способ, и если вы хотите, чтобы код имел доступ к чему-либо в этом родительском компоненте, состоял бы в том, чтобы передать функцию компоненту. Опять же, вам придется использовать render для этого:

someFunction = (passedVar) => {
    // do something with passedVar, which you'll pass from the new component
}

// ... then in the Router...

<Route path = "/some-route" render = {(props) => <NewComponent ...props onRouteLoaded = {this.someFunction} />}} />

Тогда у вас будет функция (this.props.onRouteLoaded(...)), которую вы можете запустить на componentDidMount из NewComponent, а НЕ на этом родительском компоненте. Это позволит вам передавать vars родительскому компоненту, если вам нужно получить доступ к состоянию этого компонента, реквизитам и т. д.

Рекомендуется, если вам нужно это сделать

Гораздо более чистый способ сделать это — использовать состояние Redux для передачи значений, но (при всем уважении) подумайте о жизненных циклах React, прежде чем нарушать Redux (но вы ДОЛЖНЫ нарушать Redux!)

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