router для реакцій v ^ 4.0.0 Uncaught TypeError: Не вдається прочитати властивість 'location' з undefined


85

У мене були проблеми з маршрутизатором реакцій (я використовую версію ^ 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)

о, і це пакет.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"
  }
}

Я перевіряв це в інших місцях, але не знайшов способу вирішити це.

Дякую, хлопці, за терпіння та допомогу !!

Відповіді:


221

Ви робите кілька речей неправильно.

  1. По-перше, browserHistory не є предметом у V4, тому ви можете це видалити.

  2. По-друге, ви імпортуєте все з react-router, так і повинно бути react-router-dom.

  3. По-третє, react-router-domне експортує a Router, натомість, експортує BrowserRouterтак що вам потрібно import { BrowserRouter as Router } from 'react-router-dom.

Схоже, ви щойно взяли додаток V3 і очікували, що він буде працювати з v4, що не є чудовою ідеєю.


3
Це якось так, ха-ха. я вчився на курсі в Удемі, і він використовував V3. Я спробував це, не вийшло. Я шукав спосіб використовувати його у V4, але все, що я міг знайти, - це люди, які говорили мені, щоб я зробив це. ось так я опинився тут. У будь-якому разі, дуже дякую за вашу допомогу. Я справді ціную це: D
Лукас Ферса,

Ей Тайлер, у вас є зразок коду для того самого?
Мохаммед

У мене така ж помилка в реакційному маршрутизаторі в 4.1.1 після виконання цих кроків. Чи потрібно мені самостійно створювати об'єкт історії?
PDN

1
Дякую людино! прочитавши вашу відповідь, я з’ясував, що маю помилку через версію React-Router. Оскільки я не зміг знайти хорошу документацію для v4, я вирішив перейти на V3, і тоді він почав працювати для мене, як я хотів
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}/>}/>

У мене є подібне налаштування, але на моїй цільовій сторінці мій перший компонент відображається, не натискаючи жодного посилання на меню. Я
розміщу

3

Замінити

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

С

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

Він почне працювати. Це тому, що response-router-dom експортує BrowserRouter


Чи замінює реактор-маршрутизатор-дом реакційний маршрутизатор, чи потрібно встановити обидва?
JohnnyBizzle

Зберігайте лише реакцію-router-dom
Аджай Порія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.