当前位置: 首页 > 知识库问答 >
问题:

升级后无法使react路由器工作

上官凯歌
2023-03-14

我一直在致力于将我们的应用程序从React.js 0.13升级到15.4.2以及与之相关的依赖项。我可能很接近,但经过4天50个小时后,我终于到了终点,我最后的希望。

在升级过程中,react路由器被升级到4.0.0版,每个文档、教程和堆栈溢出问题都显示了如何编写路由器(所有这些都必须是正确的),但是,当我这样做时,它总是失败。要么说历史是必需的属性,要么当我通过示例添加它时,它仍然显示为未定义和错误。

这是我们的index.js和路由器。

有人能看出我哪里做得不对吗?谢谢

从“React”导入React;

// material ui
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import Theme from './styles/theme.js';

import Header from './components/header.jsx';
import Home from './views/home.jsx';

import CaseController from 'controllers/caseController';
import LoginController from 'controllers/loginController';
import XController from 'controllers/xController';
import PredefinedSearchAssetCasesController from 'controllers/predefinedSearchAssetCasesController';
import PredefinedSearchCaseLabelsController from 'controllers/predefinedSearchCaseLabelsController';
import DeepSearchController from 'controllers/deepSearchController';
import NamesAndAddressController from 'controllers/namesAndAddressController';
import AccountListing from 'controllers/accountListingController';

import LoginStore from 'stores/loginStore';
import LoginActions from 'actions/loginActions';
import UtcStore from 'stores/utcStore';
import UtcActions from 'actions/utcActions';

import ErrorHandler from 'components/errorHandler';
import DialogMessageHandler from 'components/dialogMessageHandler';
import ConfirmationDialogHandler from 'components/confirmationDialogHandler';

// routing related
import { render } from 'react-dom';
import { Router, Route, DefaultRoute, Link, hashHistory, browserHistory } from 'react-router';

import versionNumber from 'raw-loader!../.version';

var App = React.createClass ({

  childContextTypes: {
    muiTheme: React.PropTypes.object
  },

  getChildContext() {
    return {
      muiTheme: MuiThemeProvider.get()
    };
  },

  componentWillMount() {
    //ThemeManager.setTheme(Theme);
    // TODO: consolidate into one request using /utc endpoint
    if (_.isEmpty(UtcStore.claimUtcList)) {
      UtcActions.getClaimUtcList();
    }
    if (_.isEmpty(UtcStore.assetUtcList)) {
      UtcActions.getAssetUtcList();
    }
    if (_.isEmpty(UtcStore.transferUtcList)) {
      UtcActions.getTransfers();
    }
  },

  componentDidMount() {
    LoginStore.addChangeListener(this.onLoginChange);
    if (!LoginStore.getLoginData()){
      this.transitionTo('login');
      return false;
    } else {
      LoginActions.checkToken();
    }
  },

  onLoginChange(){
    if (!LoginStore.getLoginData()){
      this.transitionTo('login');
    }
  },

  render() {

    console.log('VERSION: ', versionNumber);

    const styles = {
      root: {
        background: '#EEEEEE',
        paddingTop: 55 // see header.jsx menuHeight
      }
    };

    console.log('APP', this.context.router.getCurrentPath());

    let hideHeaderRoutes = ["/login"];
    let header = true;
    if (this.context.router.getCurrentPath().indexOf(hideHeaderRoutes) > -1){
      header = false;
      styles.root = undefined;
    }

    return (
      <MuiThemeProvider muiTheme={Theme}>
        <div style={styles.root}>
          {header ? <Header /> : {}}

          <ErrorHandler
            ref="errorHandler"
            />
          <DialogMessageHandler
            ref="dialogMessageHandler"
            />
          <ConfirmationDialogHandler
            ref="confirmDialogHandler"
            />
        </div>
      </MuiThemeProvider>
    );
  }
});

render((
  <Router history={browserHistory}>
    <Route component={App} path="/">
      <DefaultRoute component={Home}/>
      <Route path="home" component={Home} />
      <Route path="case" component={CaseController} />
      <Route path="case/:id/?:reverseToken?" component={CaseController} /> /* reverseToken is optional path variable for going back to last state when we go to case screen*/
      <Route path="login" component={LoginController} />
      <Route path="x" component={XController} />
      <Route path="x/?:xDate?/?:xFromTime?/?:xToTime?/?:id?" component={XController} />
      <Route path="namesAndAddress" component={NamesAndAddressController} />
      <Route path="reconciliation/?:reverseToken?" component={AccountListing} />
      <Route path="asset-cases/:predefinedQuery/:sortBy/?:reverseToken?" component={PredefinedSearchAssetCasesController} />
      <Route path="case-labels/:predefinedQuery/:sortBy/?:reverseToken?" component={PredefinedSearchCaseLabelsController} />
      <Route path="deep-search/:deepSearchQuery/:sortBy/openCasesOnly::openCasesOnly/assetCasesOnly::assetCasesOnly/searchType::searchType/?:reverseToken?" component={DeepSearchController} />
    </Route>
  </Router>
), document.body);

共有2个答案

亢雅懿
2023-03-14

不幸的是,这个问题的答案是没有答案,即react-router 4.00需要react-router-config来执行静态路由,就像在早期版本中一样。所以问题上面所有的代码都是没有意义的。

梁明辉
2023-03-14

看起来历史对象不再是react router的一部分。因此,您将从“react Router”导入{Router,Route,DefaultRoute,Link,hashHistory,browserHistory}实际上并没有导入hashHistory或browserHistory。

根据这些示例,获取历史对象的一个解决方案是安装history/createBrowserHistory包。

import { Router } from 'react-router'
import createBrowserHistory from 'history/createBrowserHistory'

const history = createBrowserHistory()

<Router history={history}>
  <App/>
</Router>
 类似资料:
  • 令人惊讶的是,在Google和StackOverflow中很难找到它,我在这里问,在React路由器中使用

  • react&React-Router的新功能。我正在使用react-router-4 我有以下组件-login-home-header-sidebar-content 登录组件没有标题或侧栏。 这就是我的路由 应用程序JS 然后在我的Home组件中,我有侧边栏和内容。 home.js呈现方法 侧边栏组件有一个链接,该链接具有“to”值“/home/dashboard”。 不幸的是,这并不奏效。单击

  • 我有以下index.html。我正在尝试使用路由器。 我得到了以下错误:如何克服这一点

  • 我正在尝试将react router从v3升级到v4,运行应用程序时出现以下错误: 减速器: 商店: 索引:从“React”导入React; 路线: 应用程序: 我不知道我错过了什么才能让它发挥作用 **注意:即使我只有一个路由并呈现静态组件(带文本的单个div),我仍然会看到此错误

  • 升级到iOS 10后,存储凭据时出现以下错误: 最新版本安装1.2.3.1问题似乎只在模拟器上持续存在

  • 我在Angular 2中有这样一个组件(alpha版本49): 它工作得非常好。今天我把我的角版升级到了2.0.0-beta.0。现在上面的代码失败与消息: 我在哪里犯了一个错误?更改日志对此只字未提。