반응 라우터 v ^ 4.0.0 Uncaught TypeError : 정의되지 않은 'location'속성을 읽을 수 없습니다.


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)

오, 이것은 경우를 대비하여 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"
  }
}

나는 이것을 다른 곳에서 확인했지만 그것을 해결할 방법을 찾지 못했습니다.

인내심과 도움을 주셔서 대단히 감사합니다!

답변:


221

당신은 몇 가지 일을 잘못하고 있습니다.

  1. 첫째, browserHistory는 V4의 것이 아니므로 제거 할 수 있습니다.

  2. 둘째, 모든 것을에서 가져 오는 react-router, 그것은해야합니다 react-router-dom.

  3. 셋째, react-router-doma를 내 보내지 Router않고 대신 a를 내보내 BrowserRouter므로 import { BrowserRouter as Router } from 'react-router-dom.

방금 V3 앱을 가져 와서 v4에서 작동 할 것으로 예상 한 것 같습니다. 좋은 생각이 아닙니다.


3
그것은 일종의 경우입니다 하하. 나는 Udemy의 과정에서 배우고 있었고 V3를 사용했습니다. 나는 그것을 시도했지만 작동하지 않았습니다. V4에서 사용하는 방법을 찾았지만 찾을 수있는 것은 사람들이 저에게 dowgrade를하라고 말하는 것뿐이었습니다. 그게 내가 여기까지 온 방법입니다. 어쨌든 도움을 주셔서 대단히 감사합니다. 정말 감사합니다 : D
Lucas fersa

Tyler, 같은 샘플 코드가 있습니까?
MohammedAshrafali

이 단계를 수행 한 후 4.1.1의 react-router에서 동일한 오류가 발생합니다. 히스토리 개체를 직접 만들어야합니까?
PDN

1
감사합니다! 귀하의 답변을 읽음으로써 반응 라우터 버전으로 인해 오류가 있음을 알았습니다. 나는 V4에 대한 좋은 문서를 찾을 수 없습니다 때문에, 나는 V3로 다운 그레이드하기로 결정하고 내가 원하는대로 그것은 나를 위해 일을 시작
sergioviniciuss

@TylerMcGinnis "react-router-dom은 라우터를 내 보내지 않습니다" github.com/ReactTraining/react-router/blob/… react-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}/>}/>

비슷한 설정이 있지만 랜딩 페이지에 메뉴 링크를 클릭하지 않고도 첫 번째 구성 요소가 표시됩니다. 질문이 감사를 게시 할 예정입니다
SI8

3

바꾸다

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

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

작동하기 시작합니다. react-router-dom이 BrowserRouter를 내보내기 때문입니다.


react-router-dom이 react-router를 대체합니까 아니면 둘 다 설치해야합니까?
JohnnyBizzle

react-router-dom 만 유지
Ajay Poriya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.