无法读取 ReactJS 中 NavLink 未定义的 属性 'location'
Cannot read property 'location' of undefined for NavLink in ReactJS
我正在尝试的只是一个非常基本的导航栏实现。
"dependencies": {
"bootstrap": "^3.3.7",
"jquery": "^3.2.1",
"react": "^15.4.1",
"react-dom": "^15.4.1",
"react-router": "^4.1.2",
"react-router-dom": "^4.1.1"
},
在这里你可以看到我的 MainLayout 组件:
import React, { Component } from 'react';
import { Route, BrowserRouter } from 'react-router-dom';
import './MainLayout.css';
import ReportNavComponent from './ReportNavComponent';
import NumberOfPatients from '../reports/NumberOfPatients/NumberOfPatients';
class MainLayout extends Component {
render() {
return (
<div className="pageContainer">
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<BrowserRouter>
<Route path="/numberOfPatients" component={NumberOfPatients} />
</BrowserRouter>
</div>
</div>
);
}
}
export default MainLayout;
下面是我的 导航 组件,我有一些锚标签。
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import './ReportNavMenu.css';
class ReportNavComponent extends Component {
render() {
return (
<div className="container123">
<div className="menuItem">
<p className="contentParagraph">
<i className="glyphicon glyphicon-list-alt float-left" ></i>
<NavLink exact activeClassName="active" to="/numberOfPatients">
List of Users
</NavLink>
</p>
</div>
</div>
);
}
}
export default ReportNavComponent;
我遇到以下异常:
Warning: Failed prop type: The prop `history` is marked as required in `Router`, but its value is `undefined`.
in Router
printWarning @ vendor.bundle.js:869
warning @ vendor.bundle.js:893
checkReactTypeSpec @ vendor.bundle.js:3037
validatePropTypes @ vendor.bundle.js:2475
createElement @ vendor.bundle.js:2529
(anonymous) @ app.bundle.js:sourcemap:32
__webpack_require__ @ vendor.bundle.js:53
webpackJsonpCallback @ vendor.bundle.js:24
(anonymous) @ app.bundle.js:sourcemap:1
vendor.bundle.js:5744 Uncaught TypeError: Cannot read property 'location' of undefined
at new Router (vendor.bundle.js:5744)
at app.bundle.js:11393
at measureLifeCyclePerf (app.bundle.js:11174)
at ReactCompositeComponentWrapper._constructComponentWithoutOwner (app.bundle.js:11392)
at ReactCompositeComponentWrapper._constructComponent (app.bundle.js:11378)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11286)
at Object.mountComponent (app.bundle.js:3735)
at ReactCompositeComponentWrapper.performInitialMount (app.bundle.js:11469)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11356)
at Object.mountComponent (app.bundle.js:3735)
Router @ vendor.bundle.js:5744
(anonymous) @ app.bundle.js:11393
measureLifeCyclePerf @ app.bundle.js:11174
_constructComponentWithoutOwner @ app.bundle.js:11392
_constructComponent @ app.bundle.js:11378
mountComponent @ app.bundle.js:11286
mountComponent @ app.bundle.js:3735
performInitialMount @ app.bundle.js:11469
mountComponent @ app.bundle.js:11356
mountComponent @ app.bundle.js:3735
mountComponentIntoNode @ app.bundle.js:16594
perform @ app.bundle.js:4735
batchedMountComponentIntoNode @ app.bundle.js:16616
perform @ app.bundle.js:4735
batchedUpdates @ app.bundle.js:14103
batchedUpdates @ app.bundle.js:3381
_renderNewRootComponent @ app.bundle.js:16809
_renderSubtreeIntoContainer @ app.bundle.js:16891
render @ app.bundle.js:16912
(anonymous) @ app.bundle.js:32
__webpack_require__ @ vendor.bundle.js:53
webpackJsonpCallback @ vendor.bundle.js:24
(anonymous) @ app.bundle.js:1
vendor.bundle.js:5744 Uncaught TypeError: Cannot read property 'location' of undefined
at new Router (vendor.bundle.js:5744)
at app.bundle.js:11393
at measureLifeCyclePerf (app.bundle.js:11174)
at ReactCompositeComponentWrapper._constructComponentWithoutOwner (app.bundle.js:11392)
at ReactCompositeComponentWrapper._constructComponent (app.bundle.js:11378)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11286)
at Object.mountComponent (app.bundle.js:3735)
at ReactCompositeComponentWrapper.performInitialMount (app.bundle.js:11469)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11356)
at Object.mountComponent (app.bundle.js:3735)
非常感谢您的帮助:)
更新: 我尝试了以下更改,但没有成功。我得到同样的错误:
class MainLayout extends Component {
render() {
return (
<div className="pageContainer">
<BrowserRouter>
<div>
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<Route path="/numberOfPatients" component={NumberOfPatients} />
</div>
</div>
</BrowserRouter>
</div>
);
}
}
我认为原因是,您没有在 BrowserRouter 中渲染 ReportNavComponent,这就是 ReportNavComponent 没有获取这些道具值的原因。
这样写:
return(
<div className="pageContainer">
<BrowserRouter>
<div>
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<Route path="/numberOfPatients" component={NumberOfPatients} />
</div>
</div>
</BrowserRouter>
</div>
)
我认为 history
是 NavLink
组件的必需参数,但它不可用。你可以使用withRouter
。在您的 ReportNavComponent
中导入 withRouter
并进行以下更改:
import { withRouter } from 'react-router-dom'
及以下将此组件导出为
export default withRouter(ReportNavComponent)
您需要导入 'history' 并将其添加到 BrowserRouter:
import React, { Component } from 'react';
import { Route, BrowserRouter } from 'react-router-dom';
import './MainLayout.css';
import ReportNavComponent from './ReportNavComponent';
import NumberOfPatients from '../reports/NumberOfPatients/NumberOfPatients';
import createBrowserHistory from 'history/createBrowserHistory';
const history = createBrowserHistory();
class MainLayout extends Component {
render() {
return(
<div className="pageContainer">
<BrowserRouter history={history}>
<div>
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<Route path="/numberOfPatients" component={NumberOfPatients} />
</div>
</div>
</BrowserRouter>
</div>
)
}
}
export default MainLayout;
我正在尝试的只是一个非常基本的导航栏实现。
"dependencies": {
"bootstrap": "^3.3.7",
"jquery": "^3.2.1",
"react": "^15.4.1",
"react-dom": "^15.4.1",
"react-router": "^4.1.2",
"react-router-dom": "^4.1.1"
},
在这里你可以看到我的 MainLayout 组件:
import React, { Component } from 'react';
import { Route, BrowserRouter } from 'react-router-dom';
import './MainLayout.css';
import ReportNavComponent from './ReportNavComponent';
import NumberOfPatients from '../reports/NumberOfPatients/NumberOfPatients';
class MainLayout extends Component {
render() {
return (
<div className="pageContainer">
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<BrowserRouter>
<Route path="/numberOfPatients" component={NumberOfPatients} />
</BrowserRouter>
</div>
</div>
);
}
}
export default MainLayout;
下面是我的 导航 组件,我有一些锚标签。
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import './ReportNavMenu.css';
class ReportNavComponent extends Component {
render() {
return (
<div className="container123">
<div className="menuItem">
<p className="contentParagraph">
<i className="glyphicon glyphicon-list-alt float-left" ></i>
<NavLink exact activeClassName="active" to="/numberOfPatients">
List of Users
</NavLink>
</p>
</div>
</div>
);
}
}
export default ReportNavComponent;
我遇到以下异常:
Warning: Failed prop type: The prop `history` is marked as required in `Router`, but its value is `undefined`.
in Router
printWarning @ vendor.bundle.js:869
warning @ vendor.bundle.js:893
checkReactTypeSpec @ vendor.bundle.js:3037
validatePropTypes @ vendor.bundle.js:2475
createElement @ vendor.bundle.js:2529
(anonymous) @ app.bundle.js:sourcemap:32
__webpack_require__ @ vendor.bundle.js:53
webpackJsonpCallback @ vendor.bundle.js:24
(anonymous) @ app.bundle.js:sourcemap:1
vendor.bundle.js:5744 Uncaught TypeError: Cannot read property 'location' of undefined
at new Router (vendor.bundle.js:5744)
at app.bundle.js:11393
at measureLifeCyclePerf (app.bundle.js:11174)
at ReactCompositeComponentWrapper._constructComponentWithoutOwner (app.bundle.js:11392)
at ReactCompositeComponentWrapper._constructComponent (app.bundle.js:11378)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11286)
at Object.mountComponent (app.bundle.js:3735)
at ReactCompositeComponentWrapper.performInitialMount (app.bundle.js:11469)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11356)
at Object.mountComponent (app.bundle.js:3735)
Router @ vendor.bundle.js:5744
(anonymous) @ app.bundle.js:11393
measureLifeCyclePerf @ app.bundle.js:11174
_constructComponentWithoutOwner @ app.bundle.js:11392
_constructComponent @ app.bundle.js:11378
mountComponent @ app.bundle.js:11286
mountComponent @ app.bundle.js:3735
performInitialMount @ app.bundle.js:11469
mountComponent @ app.bundle.js:11356
mountComponent @ app.bundle.js:3735
mountComponentIntoNode @ app.bundle.js:16594
perform @ app.bundle.js:4735
batchedMountComponentIntoNode @ app.bundle.js:16616
perform @ app.bundle.js:4735
batchedUpdates @ app.bundle.js:14103
batchedUpdates @ app.bundle.js:3381
_renderNewRootComponent @ app.bundle.js:16809
_renderSubtreeIntoContainer @ app.bundle.js:16891
render @ app.bundle.js:16912
(anonymous) @ app.bundle.js:32
__webpack_require__ @ vendor.bundle.js:53
webpackJsonpCallback @ vendor.bundle.js:24
(anonymous) @ app.bundle.js:1
vendor.bundle.js:5744 Uncaught TypeError: Cannot read property 'location' of undefined
at new Router (vendor.bundle.js:5744)
at app.bundle.js:11393
at measureLifeCyclePerf (app.bundle.js:11174)
at ReactCompositeComponentWrapper._constructComponentWithoutOwner (app.bundle.js:11392)
at ReactCompositeComponentWrapper._constructComponent (app.bundle.js:11378)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11286)
at Object.mountComponent (app.bundle.js:3735)
at ReactCompositeComponentWrapper.performInitialMount (app.bundle.js:11469)
at ReactCompositeComponentWrapper.mountComponent (app.bundle.js:11356)
at Object.mountComponent (app.bundle.js:3735)
非常感谢您的帮助:)
更新: 我尝试了以下更改,但没有成功。我得到同样的错误:
class MainLayout extends Component {
render() {
return (
<div className="pageContainer">
<BrowserRouter>
<div>
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<Route path="/numberOfPatients" component={NumberOfPatients} />
</div>
</div>
</BrowserRouter>
</div>
);
}
}
我认为原因是,您没有在 BrowserRouter 中渲染 ReportNavComponent,这就是 ReportNavComponent 没有获取这些道具值的原因。
这样写:
return(
<div className="pageContainer">
<BrowserRouter>
<div>
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<Route path="/numberOfPatients" component={NumberOfPatients} />
</div>
</div>
</BrowserRouter>
</div>
)
我认为 history
是 NavLink
组件的必需参数,但它不可用。你可以使用withRouter
。在您的 ReportNavComponent
中导入 withRouter
并进行以下更改:
import { withRouter } from 'react-router-dom'
及以下将此组件导出为
export default withRouter(ReportNavComponent)
您需要导入 'history' 并将其添加到 BrowserRouter:
import React, { Component } from 'react';
import { Route, BrowserRouter } from 'react-router-dom';
import './MainLayout.css';
import ReportNavComponent from './ReportNavComponent';
import NumberOfPatients from '../reports/NumberOfPatients/NumberOfPatients';
import createBrowserHistory from 'history/createBrowserHistory';
const history = createBrowserHistory();
class MainLayout extends Component {
render() {
return(
<div className="pageContainer">
<BrowserRouter history={history}>
<div>
<div className="reportNavBar">
<ReportNavComponent />
</div>
<div className="reportContent">
<Route path="/numberOfPatients" component={NumberOfPatients} />
</div>
</div>
</BrowserRouter>
</div>
)
}
}
export default MainLayout;