Как перезагрузить URL, не обновляя страницу в ReactJs? - PullRequest
0 голосов
/ 26 сентября 2018

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

TypeError: history.pushState не является функцией.

Вот мой код:

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);

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

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

<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>
0 голосов
/ 26 сентября 2018

используйте этот код Router.browserHistory.push ('/');instaed of history.pushState (null, "/: folderName")

...