Принуждение React-Router загружать страницу, даже если мы уже на этой странице

есть ли способ заставить React-Router <Link> чтобы загрузить страницу с пути, даже если текущее местоположение уже которую страницу? Я не могу найти никакого упоминания об этом в документах react-router.

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

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

, нажмите <Link> ничего не делает, потому что react-router видит, что мы уже на странице "применить", и поэтому не размонтирует текущий страница, чтобы затем смонтировать другой.

есть ли способ силу это чтобы отключить текущую страницу перед затем установить запрашиваемую страницу, даже если на странице уже якобы? (через <Link> свойства например?)

5 ответов


исправление, которое я использовал для решения моей маленькой потребности вокруг этого, должно было пройти в state свойство в ссылку, как так <Link to={{pathname: "/page", state: "desiredState"}}>Page</Link>. Затем я могу проверить это в целевом компоненте (скажем <Page />) componentWillReceiveProps вот так:

componentWillReceiveProps(nextProps){
  if (nextProps.location.state === 'desiredState') {
    // do stuffs
  }
}

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


не хорошее решение, потому что оно заставляет полное обновление страницы и выдает ошибку, но вы можете вызвать forceUpdate () с помощью обработчика onClick, такого как:

<Link onClick={this.forceUpdate} to={'/the-page'}>
    Click Me
</Link>

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

React router Link не вызывает обновление компонента во вложенных маршрутах


в компоненте маршрута укажите случайный ключ.

<Route path={YOURPATH} render={(props) => <YourComp {...props} keyProp={someValue} key={randomGen()}/>} />

когда react увидит другой ключ, они вызовут rerender.


Я решил это, нажав новый маршрут в историю, а затем заменив этот маршрут текущим маршрутом (или маршрутом, который вы хотите обновить). Это вызовет react-router для "перезагрузки" маршрута без обновления всей страницы.

<Link onClick={this.reloadRoute()} to={'/route-to-refresh'}>
    Click Me
</Link>

let reloadRoute = () => {
    router.push({ pathname: '/empty' });
    router.replace({ pathname: '/route-to-refresh' });
}

React router работает с помощью истории браузера для навигации без перезагрузки всей страницы. Если вы заставите маршрут в историю, маршрутизатор react обнаружит это и перезагрузит маршрут. Важно заменить пустой маршрут так, чтобы кнопка "назад" не выводит вас на пустой маршрут после нажатия на нее.

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


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

/**
 * @param {object} nextProps new properties
 */
    componentWillReceiveProps = (nextProps)=> {
        if (nextProps.location.key !== this.props.location.key) {
            window.location.reload();
        }
    };