реагировать на маршрутизатор v ^ 4.0.0 Uncaught TypeError: невозможно прочитать свойство 'location' неопределенного

91

У меня возникли проблемы с реактивным маршрутизатором (я использую версию ^ 4.0.0).

это мой index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
import { Router, Route, Link, browserHistory } from 'react-router';


ReactDOM.render(
  <Router history={browserHistory} >
    <Route path="/" component={App} />

  </Router>,
  document.getElementById('root')
);

App.js - это что угодно. Я публикую здесь основной, потому что это не проблема (я считаю)

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <div className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h2>Welcome to React</h2>
        </div>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
      </div>
    );
  }
}

export default App;

и вот что происходит, когда я проверяю журнал консоли

Router.js:43 Uncaught TypeError: Cannot read property 'location' of undefined
    at new Router (Router.js:43)
    at ReactCompositeComponent.js:295
    at measureLifeCyclePerf (ReactCompositeComponent.js:75)
    at ReactCompositeComponentWrapper._constructComponentWithoutOwner (ReactCompositeComponent.js:294)
    at ReactCompositeComponentWrapper._constructComponent (ReactCompositeComponent.js:280)
    at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:188)
    at Object.mountComponent (ReactReconciler.js:46)
    at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
    at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
    at Object.mountComponent (ReactReconciler.js:46)

ой, а это package.json на всякий случай

{
  "name": "teste2",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^15.4.2",
    "react-dom": "^15.4.2",
    "react-router": "^4.0.0"
  },
  "devDependencies": {
    "react-scripts": "0.9.5"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

Я проверял это в других местах, но не нашел способа решить эту проблему.

Спасибо, ребята, за терпение и помощь !!

Лукас Ферса
источник

Ответы:

240

Вы делаете несколько вещей неправильно.

  1. Во-первых, browserHistory отсутствует в V4, поэтому вы можете удалить это.

  2. Во-вторых, вы импортируете все react-router, что должно быть react-router-dom.

  3. В-третьих, react-router-domон не экспортирует Router, а экспортирует, BrowserRouterпоэтому вам нужно import { BrowserRouter as Router } from 'react-router-dom.

Похоже, вы просто взяли свое приложение V3 и ожидали, что оно будет работать с версией 4, что не очень хорошая идея.

Тайлер МакГиннис
источник
3
Это своего рода случай, ха-ха. Я учился на курсе в Удеми, и он использовал V3. Я пробовал, не сработало. Я искал способ использовать его в V4, но все, что я смог найти, это люди, говорящие мне о понижении. вот как я оказался здесь. В любом случае, большое спасибо за вашу помощь. Я действительно ценю это: D
Lucas fersa
Привет, Тайлер, у тебя есть образец кода для того же самого?
Мохаммед
У меня такая же ошибка в response-router в 4.1.1 после выполнения этих шагов. Нужно ли мне самому создавать объект истории?
PDN
1
Спасибо чувак! прочитав ваш ответ, я узнал, что у меня была ошибка из-за версии реактивного маршрутизатора. Так как я не смог найти хорошую документацию для версии 4, я решил перейти на версию 3, и тогда она начала работать для меня так, как я хотел
sergioviniciuss
@TylerMcGinnis "response-router-dom не экспортирует маршрутизатор" github.com/ReactTraining/react-router/blob/… response -router-dom выдает это предупреждение, в котором говорится о необходимости использования Router.
corysimmons
6

Я пробовал все, что предлагалось здесь, но у меня не получилось. Так что на случай, если я смогу помочь кому-нибудь с подобной проблемой, каждый проверенный мной учебник не обновлен для работы с версией 4.

Вот что я сделал, чтобы все заработало

import React from 'react';
import App from './App';

import ReactDOM from 'react-dom';
import {
    HashRouter,
    Route
} from 'react-router-dom';


 ReactDOM.render((
        <HashRouter>
            <div>
                <Route path="/" render={()=><App items={temasArray}/>}/>
            </div>
        </HashRouter >
    ), document.getElementById('root'));

Это единственный способ заставить его работать без ошибок или предупреждений.

Если вы хотите передать реквизиты своему компоненту, для меня самый простой способ:

 <Route path="/" render={()=><App items={temasArray}/>}/>
Ланселот
источник
У меня аналогичная настройка, но на моей целевой странице мой первый компонент отображается без нажатия на ссылку меню. Я
запрошу
4

Заменить

import { Router, Route, Link, browserHistory } from 'react-router';

С участием

import { BrowserRouter as Router, Route } from 'react-router-dom';

Он начнет работать. Это потому, что react-router-dom экспортирует BrowserRouter

Аджай Пория
источник
Заменяет ли response-router-dom реагирующий маршрутизатор или вам нужно установить оба?
JohnnyBizzle
Only keep
react
0

так что если вам нужно использовать этот код)

import { useRoutes } from "./routes";

import { BrowserRouter as Router } from "react-router-dom";

export const App = () => {

const routes = useRoutes(true);

  return (

    <Router>

      <div className="container">{routes}</div>

    </Router>

  );

};

// ./routes.js 

import { Switch, Route, Redirect } from "react-router-dom";

export const useRoutes = (isAuthenticated) => {
  if (isAuthenticated) {
    return (
      <Switch>
        <Route path="/links" exact>
          <LinksPage />
        </Route>
        <Route path="/create" exact>
          <CreatePage />
        </Route>
        <Route path="/detail/:id">
          <DetailPage />
        </Route>
        <Redirect path="/create" />
      </Switch>
    );
  }
  return (
    <Switch>
      <Route path={"/"} exact>
        <AuthPage />
      </Route>
      <Redirect path={"/"} />
    </Switch>
  );
};
vipdanek
источник
2
привет, подумайте о добавлении некоторой информации о вашем коде, объясните, что вы сделали.
Gianmarco
Я использую маршрутизатор в папке с именами маршрутов, которые вы можете увидеть при импорте в App.js, и я использую в этом коде аутентификацию, если isAuthenticated (). И я сообщил функции, использующие маршрутизаторы для App.js
vipdanek
1
отредактируйте свой ответ, чтобы пользователи, которые его прочитали, имели полное представление о ситуации и решении
Gianmarco