prop`history`는`Router`에서 필수로 표시되지만 그 값은`undefined`입니다. 라우터에서


97

저는 ReactJs를 처음 사용합니다. 이것은 내 코드입니다.

var React = require('react');
var ReactDOM = require('react-dom');
var {Route, Router, IndexRoute, hashHistory} = require('react-router');
var Main = require('Main');
ReactDOM.render(
  <Router history={hashHistory}>
  <Route path="/" component={Main}></Route>
</Router>, document.getElementById('app'));

웹팩으로 컴파일합니다. 또한 별칭에 Main 구성 요소를 추가했습니다. 콘솔에서 다음 오류가 발생합니다. 다음 링크도 읽었습니다.

React Router 실패한 prop '히스토리', 정의되지 않음

값이 정의되지 않은 경우 기록을 필수로 표시하려면 어떻게해야합니까?

React-Router를 업그레이드하고 hashHistory를 browserHistory로 대체

웹 검색이 많았지 만이 문제를 해결할 수 없었습니다. React Router는 버전 4입니다.

답변:


172

react-router v4를 사용하는 경우 react-router-dom도 설치해야합니다. 그런 다음 react-router-dom에서 BrowserRouter를 가져오고 Router를 BrowserRouter로 전환합니다. v4가 여러 가지를 변경 한 것 같습니다. 또한 react-router 문서는 오래되었습니다. 이것은 내 작업 코드입니다.

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route } from 'react-router-dom'
import App from './components/App';

ReactDOM.render((
     <BrowserRouter>
          <Route path="/" component={App}/>
     </BrowserRouter>
     ),
     document.getElementById('root')
);

출처


11
버전 4에서는 'react-router-dom'을 사용할 때 'react-router'를 가져올 필요가 없습니다. 'react-router-dom'이 완료되었습니다.
Mammad2c

4
BrowserRouter 내에 여러 개의 <Route ...> 태그가있는 경우 "Uncaught Error : A <Router>에는 자식 요소가 하나만있을 수 있습니다."라는 오류가 발생합니다. 어떻게 고치는 지?
olefrank

1
@erp react-router-dom에는 react-router보다 더 많은 옵션이 있습니다. 문서를 방문 할 수 있습니다. 그러나 당신은 그들 중 하나만 사용했습니다.
Mammad2c

2
@NSCoder 아니요, 라우터도 'react-router-dom'에 있으므로 'react-router-dom'과 'react-router'를 모두 포함 할 필요가 없습니다. 'HashRouter'와 'router'가 함께 필요한 경우 'react-router-dom'을 포함해야합니다.
Mammad2c

1
@olefrank 여러 <Route...>문장 <switch><div>. 를 사용 <div>하면 경로가 포함됩니다. 즉, 경로가 두 경로와 일치하면 두 구성 요소가 모두 렌더링됩니다. 여기에 전체 세부 사항을 참조하십시오 medium.com/@djoepramono/react-router-4-gotchas-2ecd1282de65
무하마드 한난에게

17

어떤 버전의 React Router를 사용하고 있습니까? 라우터 버전 4는 browserHistory 클래스를 전달하는 것에서 browserHistory의 인스턴스를 전달하는 것으로 변경되었습니다 . 새 문서코드 예제를 참조하세요 .

이것은 자동으로 업그레이드하는 많은 사람들을 사로 잡고 있습니다. 마이그레이션 문서는 '언제든지'나옵니다.

이것을 맨 위에 추가하고 싶습니다.

import createBrowserHistory from 'history/createBrowserHistory'

const newHistory = createBrowserHistory();

<Router history={newHistory}/>

버전 4. 내 코드를 버전 4로 변환 해 주시겠습니까?
Mammad2c

어디에 customHistory정의되어 있습니까?
SharpCoder

죄송합니다. 더 나은 지금?
Charles Merriam

4

여러 경로 를 원할 경우 이와 같은 스위치를 사용할 수 있습니다.

import {Switch} from 'react-router'; 

그때

<BrowserRouter>
     <Switch>
         <Route exact path="/" component={TodoComponent} />
         <Route path="/about" component={About} />
     </Switch>
</BrowserRouter>

3

ES6에서 같은 문제가 발생했지만 'react-router-dom'라이브러리를 사용하도록 전환했을 때 문제가 해결되었습니다. ES6의 모든 팬을 위해 여기에 있습니다.

npm install --save react-router-dom

index.js에서 :

import {HashRouter, Route} from 'react-router-dom';
import App from './App';

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

In index.js:또는 In index.jsx:?
말이 맞아 Galstyan

webpack을 사용하는 경우 @RazGalstyan index.js.
Teoman shipahi

1

React Router 버전 4는 몇 가지 사항을 변경했습니다. 그들은 다른 히스토리 유형에 대해 별도의 최상위 라우터 요소를 만들었습니다. 당신은 버전 4를 사용하는 경우에는 교체 할 수 있어야한다 <Router history={hashHistory}><HashRouter><BrowserRouter>.
자세한 내용은 https://reacttraining.com/react-router/web/guides를 참조 하십시오.


0

나는 또한 로그인 연습을 작성합니다. 또한 당신과 같은 질문을 만나십시오. 하루의 고투 끝에 나는 this.props.history.push('/list/')많은 플러그인을 가져 오는 대신에 그것을 만들 수 있다는 것을 알았 습니다. 그건 그렇고, react-router-dom버전은 ^4.2.2. 감사!

handleSubmit(e){
    e.preventDefault();
    this.props.form.validateFieldsAndScroll((err,values)=>{
        if(!err){
            this.setState({
                visible:false
            });
            this.props.form.resetFields();
            console.log(values.username);
            const path = '/list/';
            this.props.history.push(path);
        }
    })
}


0

아래는 "react-router@^3.0.5"에서 저에게 적합합니다.

package.json :

"react-dom": "^16.6.0",
"react-router": "^3.0.5"

index.js :

import { render } from 'react-dom'
import { App } from './components/App'
import { NotFound404 } from './components/NotFound404'
import { Router, Route, hashHistory } from 'react-router'

render(
    <Router history={hashHistory}>
        <Route path='/' component={App} />
        <Route path='*' component={NotFound404} />
    </Router>,
    document.getElementById('root')
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.