Компонент не восстанавливается при изменении параметров маршрута

Я работаю над реагирующим приложением с помощью реактивного маршрутизатора. У меня есть страница проекта с URL-адресом:

myapplication.com/project/unique-project-id

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

myapplication.com/project/982378632
myapplication.com/project/782387223
myapplication.com/project/198731289

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

Ответ 1

Если ссылка направляется на тот же маршрут только с другим параметром, он не перемонтируется, а вместо этого получает новые реквизиты. Таким образом, вы можете использовать функцию componentWillReceiveProps(newProps) и искать newProps.params.projectId.

Если вы пытаетесь загрузить данные, я бы рекомендовал получать данные до того, как маршрутизатор обработает совпадение, используя статические методы для компонента. Проверьте этот пример. Реагировать на Mega Demo Router. Таким образом, компонент будет загружать данные и автоматически обновляться при изменении параметров маршрута без необходимости полагаться на componentWillReceiveProps.

Ответ 2

Если вам понадобится перезагрузка компонента при изменении маршрута, вы можете передать уникальный ключ вашему атрибуту ключа компонента (ключ связан с вашим путем/маршрутом). Таким образом, каждый раз, когда маршрут изменяется, ключ также изменяет, какие триггеры реагируют на компонент для размонтирования/повторного подключения. Я получил идею этого ответа

Ответ 3

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

import theThingsYouNeed from './whereYouFindThem'

export default class Project extends React.Component {

    componentWillMount() {

        this.state = {
            id: this.props.router.params.id
        }

        // fire action to update redux project store
        this.props.dispatch(fetchProject(this.props.router.params.id))
    }

    componentDidUpdate(prevProps, prevState) {
         /**
         * this is the initial render
         * without a previous prop change
         */
        if(prevProps == undefined) {
            return false
        }

        /**
         * new Project in town ?
         */
        if (this.state.id != this.props.router.params.id) {
           this.props.dispatch(fetchProject(this.props.router.params.id))
           this.setState({id: this.props.router.params.id})
        }

    }

    render() { <Project .../> }
}

Ответ 4

react-router нарушается, потому что он должен перемонтировать компоненты при любом изменении местоположения.

Мне удалось найти исправление для этой ошибки:

https://github.com/ReactTraining/react-router/issues/1982#issuecomment-275346314

Короче (см. ссылку выше для полной информации)

<Router createElement={ (component, props) =>
{
  const { location } = props
  const key = `${location.pathname}${location.search}`
  props = { ...props, key }
  return React.createElement(component, props)
} }/>

Это позволит перемонтировать его при любом изменении URL