如何在不刷新ReactJs页面的情况下重新加载URL?

时间:2018-09-26 11:47:47

标签: javascript reactjs routing react-router react-router-dom

我试图重新加载到同一路由上,而不必刷新页面。对于此特定情况,使用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);

有更好的方法吗?还是我在这里错过了什么?

3 个答案:

答案 0 :(得分:0)

请使用此代码 Router.browserHistory.push('/'); insted of history.pushState(null,“ /:folderName”)

答案 1 :(得分:0)

您执行此操作的可能性很小,目前,我最喜欢的方法是在组件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>

答案 2 :(得分:0)

您可能会通过强制组件重新渲染来获得所需的结果,请查看 documentation here。我看到您正在扩展 React.Component,因此您应该能够执行以下操作:

...

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

...

reload() {
   this.forceUpdate();
}

...

我知道它不使用 history,但不需要其他代码,因为它包含在 Component 类中。