Как перезагрузить URL без обновления страницы в ReactJs?

Я пытаюсь выполнить перезагрузку по тому же маршруту, не обновляя страницу. В этом конкретном случае используется history.pushState(), но я получаю сообщение об ошибке:

TypeError: history.pushState is not a function.

Вот мой код:

import React from 'react';
import PropTypes from 'prop-types';
import { Container } from 'kawax-js';
import { Switch, Route } from 'react-router-dom';
import File from './FileContainer';
import Folder from './FolderContainer';
import HomeContainer from './HomeContainer';

class RootContainer extends React.Component {

  static stateToProps = ({ ownProps, select }) => {
   const files = select('files');
   const lastFile =  _.last(files);
   return ({
    lastFile: lastFile || {}
 })
};

  static propTypes = {
   history: PropTypes.object.isRequired
};

  static defaultProps = {
   lastFile: {}
};

render() {
 const { lastFile, history } = this.props;
 if ( lastFile === {} || !lastFile.isUploaded
  || lastFile.isUploaded === null) {
  return (
    <Switch>
      <Route exact path = "/" component = {HomeContainer} />
      <Route exact path = "/file/:itemPath/:refHash" component = {File} />
      <Route exact path = "/:folderName" component  = {Folder}/>
    </Switch>
   );
  }
  return history.pushState(null, "/:folderName")
 }
}

export default Container(RootContainer);

Есть ли лучший способ сделать это, или я что-то здесь упускаю?

Какова цель обновления истории?

Aditya Chawla 26.09.2018 13:51
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
8 542
3

Ответы 3

пожалуйста, используйте этот код Router.browserHistory.push ('/'); вместо history.pushState (null, "/: имя папки")

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

Lovro Bilješković 26.09.2018 14:26

тогда вы помещаете свой текущий URL после /

sony johns 26.09.2018 14:29

Я пробовал это, но потом у меня появился RootContainer(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.. Я тоже попробовал <Redirect to = {location} component = {Folder}/>, но в этом случае получаю: You tried to redirect to the same route you're currently on: "/test".

Lovro Bilješković 26.09.2018 14:39

попробуйте вот это location.reload ();

sony johns 26.09.2018 14:46

Пробовал раньше: D, что действительно обновляет страницу, которую я не хочу, я хочу, чтобы она была одностраничной, где ничего не нужно обновлять. Я действительно схожу с ума здесь ...

Lovro Bilješković 26.09.2018 14:50

используйте следующий fomat window.history.pushState ({"html": response.html, "page Title": r‌ response.page Title}, "‌", путь к URL-адресу); не теряй надежду

sony johns 26.09.2018 14:58

Для более подробного изучения управления историей браузера см. Этот developer.mozilla.org/en-US/docs/Web/API/History_API

sony johns 26.09.2018 15:12

У вас есть несколько возможностей сделать это, в настоящее время мой любимый способ сделать это - использовать анонимную функцию в опоре компонента:

<Switch>
  <Route exact path = "/" component = {()=><HomeContainer/>} />
  <Route exact path = "/file/:itemPath/:refHash" component = {()=><File/>} />
  <Route exact path = "/:folderName" component  = {()=><Folder/>}/>
</Switch>

Или, если вы хотите обновить текущие параметры URL-адреса, вам понадобится дополнительный маршрут (перезагрузка) и немного поиграйте со стеком маршрутизатора:

reload = ()=>{
 const current = props.location.pathname;
 this.props.history.replace(`/reload`);
    setTimeout(() => {
      this.props.history.replace(current);
    });
}

<Switch>
  <Route path = "/reload" component = {null} key = "reload" />
  <Route exact path = "/" component = {HomeContainer} />
  <Route exact path = "/file/:itemPath/:refHash" component = {File} />
  <Route exact path = "/:folderName" component  = {Folder}/>
</Switch>

<div onCLick = {this.reload}>Reload</div>

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

...

constructor() {
    this.reload = this.reload.bind(this);
}

...

reload() {
   this.forceUpdate();
}

...

Я знаю, что он не использует history, но другого кода не потребуется, так как он включен в класс Component.

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