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

从v3到v4的React路由器Redux升级

拓拔迪
2023-03-14

我正在尝试将react router从v3升级到v4,运行应用程序时出现以下错误:

Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in.

减速器:

import { combineReducers } from 'redux';
import { routerReducer } from 'react-router-redux';

import { login } from './login-reducer';

const reducers = combineReducers({
  routing: routerReducer,
  login
})

export default reducers;

商店:

import { createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk';
import createHistory from 'history/createBrowserHistory'
import { routerMiddleware } from 'react-router-redux'

import reducers from '../reducers';

export const history = createHistory();
const routerMiddle = routerMiddleware(history);

const composeEnhancers =
  typeof window === 'object' &&
  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?   
    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
      // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...
    }) : compose;

let middleware = [routerMiddle, thunk]
const enhancer = composeEnhancers(
  applyMiddleware(...middleware),
  // other store enhancers if any
);

const store = createStore(reducers, enhancer);

export default store;

索引:从“React”导入React;

import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'
import store, { history } from './store/createStore';
import { ConnectedRouter } from 'react-router-redux'

import { getRoutes } from './routes';

import './index.css';

ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <div>{ getRoutes(store) }</div>
    </ConnectedRouter>
  </Provider>,
  document.getElementById('root')
);

路线:

import React from 'react';
import { Route } from 'react-router';

import App from './containers/App';
import Login from './containers/Login';
import Protected from './components/Protected';

export const getRoutes = (store) => {
  const authRequired = (nextState, replaceState) => {
    // Now you can access the store object here.
    const state = store.getState();

    if (!state.login.loggedIn || state.login.loggedIn == null) {
      // Not authenticated, redirect to login.
      replaceState({
        pathname: '/login',
        state: { nextPathname: nextState.location.pathname }
      });
    }
  };

  return (
    <div>
      <Route exact path="/" component={App} />
      <Route path="/login" component={Login} />
      <Route path="/protected" component={Protected} onEnter={authRequired} />
    </div>
  );
}

应用程序:

import React, { Component } from 'react';
import { Link } from 'react-router';
import { connect } from 'react-redux'

import logo from '../logo.svg';
import './App.css';

class App extends Component {
  render() {
    const isLoggedIn = this.props.isLoggedIn;
    return (
      <div className="App">
        <div className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h2><Link to="/">Welcome to React</Link></h2>
          <div className="app-nav">
            <nav>
              <Link to='about'>About</Link>
              <Link to='login'>{( isLoggedIn ? 'Logout' : 'Login' )}</Link>
              <Link to='protected'>Protected</Link>
            </nav>
          </div>
        </div>
        {this.props.children}
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  return {
    isLoggedIn:  (state.login.loggedIn ? state.login.loggedIn : false) 
  }
}

App = connect (
  mapStateToProps
)(App)

export default App;

我不知道我错过了什么才能让它发挥作用

**注意:即使我只有一个路由/并呈现静态组件(带文本的单个div),我仍然会看到此错误

共有3个答案

余歌者
2023-03-14

这个问题与正在使用的react router redux版本有关。当我将它添加到项目中时,我取消了@next

公孙宗清
2023-03-14

问题可能就在这里

import { Link } from 'react-router';

react路由器不导出链接react路由器dom导出。

import { Link } from 'react-router-dom';

您可能也应该从react-router-dom导入Road组件。

孔厉刚
2023-03-14

A) 使用react router 4,您根本不需要react router redux,特别是如果您只想呈现经过身份验证的组件。

B) 在RR4中,onEnter钩子不是这样工作的,它是执行路由验证的旧方法

{this.props.children}为什么仍然使用props.children渲染子路由?所有子路由都进入它所在的组件

如果你想学习rr4,我建议你检查一下这个样板https://github.com/touqeerkhan11/The-Ultimate-Boilerplate

 类似资料:
  • 我在想这样的事情: 前台有一个不同的布局和风格与管理区域。所以在frontpage中的路由是home、about等等,其中一个应该是子路由。 /home应该呈现到Frontpage组件中,而/admin/home应该呈现在后端组件中。 最终解决方案: 这是我现在使用的最终解决方案。这个例子也像传统的404页面一样有一个全局错误组件。

  • 使用redux和反应路由器,我想访问路由指定的组件以外的组件上的路由参数。 我已经对react-router、redux和react-router-redux进行了如下设置,我想从我的redux存储访问reportId参数。 我已经尝试连接react-redux路由器来存储路由状态,但是我发现除了活动路由的完整路径之外,redux内部没有任何有用的存储。这让我可以选择从redux中的路径解析出re

  • 我正在使用react路由器v4和redux,如果用户未登录,我想使用私有和受保护的路由重定向。 我有一个路由组件: 它是这样实现的: 这是私人路线: 传递prop的最佳方式是什么,如果我连接Routes组件并从那里传递是否可以,或者应该从其他地方传递,或者连接需要它的每个组件并从那里读取?此外,这种方法如何处理嵌套路由,如?谢谢

  • 我有一个简单的(目前)应用程序,使用react router和redux,我想为它添加国际化功能。 我已经安装了npm包,并且能够安装和运行提供的示例。我已经将适当的导入添加到我自己的应用程序中,并将国际化标签添加到根渲染方法中。 当我将I18nextProvider标记添加到render方法时,我得到了错误 找不到模块“react” 这并不是特别有用,尤其是因为如果我删除标签,react应用程序

  • 我正在学习如何通过在线教程做出反应。 这是一个关于使用React路由器的基本示例: 与我的应用程序组件: 但是,我在使用IndexRoute时遇到问题,因为它没有显示任何内容,所以我在npm上搜索react router dom v4模块,但里面没有IndexRoute。相反,它使用的是: 那么,我如何渲染2组件为1路径?