Обновление React Router Redux с v3 до v4

Я пытаюсь обновить response-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;

index: импортировать 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 с текстом)


person erichardson30    schedule 24.04.2017    source источник
comment
вы устранили проблему?   -  person Vinz243    schedule 06.05.2017


Ответы (3)


A) Вам вообще не нужно реагировать на сокращение маршрутизатора с помощью реагирующего маршрутизатора 4, особенно если все, что вам нужно, - это визуализировать аутентифицированные компоненты.

Б) Хук onEnter не работает таким образом в RR4, это старый способ проверки маршрута.

{this.props.children} почему вы все еще рендерете дочерние маршруты с помощью props.children? Все дочерние маршруты входят в компонент, в котором они находятся.

Если вы пытаетесь изучить rr4, я рекомендую проверить этот шаблон https://github.com/touqeerkhan11/The-Ultimate-Boilerplate

person xtabbas    schedule 24.04.2017
comment
Опубликованная ссылка на github @eersteam - отличный ресурс. Кроме того, обычно, когда я вижу эту ошибку, моя функция рендеринга не смогла вернуть некоторый JSX - person TYMG; 04.05.2017

Проблема, наверное, здесь

import { Link } from 'react-router';

react-router не поддерживает экспорт Link, react-router-dom делает.

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

Вероятно, вам также следует импортировать компонент Route из react-router-dom.

person QoP    schedule 24.04.2017
comment
Ни то, ни другое ничего не изменило. Ошибка возникает в строке ‹ConnectedRouter в индексе - person erichardson30; 24.04.2017
comment
ну, я думаю, они были частью проблемы :-P - person QoP; 24.04.2017
comment
Ха-ха, да, они были бы, если бы я прошел мимо того места, где застрял. Спасибо, что указали на них - person erichardson30; 24.04.2017

Проблема была связана с используемой версией response-router-redux. Когда я добавил его в проект, я отказался от @next

person erichardson30    schedule 24.04.2017