React Router - 无法读取未定义的 属性 'history'
React Router - Cannot read property 'history' of undefined
我正在构建一个样式指南应用程序。我有两个下拉组件,用户可以在其中选择品牌和组件 - 然后应用程序将显示根据 selected 品牌标记的所选组件。我希望这两个选项都包含在 URL.
中
以编程方式更改路线的两个下拉菜单。我收到错误 TypeError: Cannot read 属性 'history' of undefined 每当用户与任一下拉菜单交互时。
我有一个组件被路由渲染:
<Route path="/:brand/:component"
render={props => <DisplayComponent {...props} />} />
该组件有两个下拉组件的两个事件处理程序,让用户 select 根:
handleComponentPick(event: any) {
const component = event.target.value;
this.props.history.push(`/${this.props.match.params.brand}/${component}`);
}
handleBrandChange = (event: any) => {
if (event.target instanceof HTMLElement) {
const brand = event.target.value;
this.props.history.push(`/${brand}/${this.props.match.params.component}`);
}
};
render = () => {
return (
<div className={"constrain-width-wide center "}>
<ThemePicker
component={this.props.match.params.component}
brand={this.props.match.params.brand}
handleBrandChange={this.handleBrandChange}
handleComponentPick={this.handleComponentPick}
/>
<div className="currently-selected-component" />
<Route path="/:brand/button" component={Button} />
<Route path="/:brand/card" component={Card} />
</div>
);
};
}
我将整个应用程序包装在 Router
。
ReactDOM.render(
<Router>
<App />
</Router>,
document.getElementById("root")
);```
你能试试下面这些改变吗
handleComponentPick(event: any) {
至 handleComponentPick = (event: any) => {
然后
render = () => {
至 render() {
希望这有效。
你必须像
一样传递历史
<Router history={browserHistory} routes={routes} />,
这样,您就可以使用带有道具的历史记录进行导航。
字体:https://github.com/ReactTraining/react-router/blob/v3/docs/guides/Histories.md
尝试在你身上使用 browserHistory app.js,喜欢
render(
<Router history={browserHistory}>
<Route path='/' component={App}>
<IndexRoute component={Home} />
<Route path='about' component={About} />
<Route path='features' component={Features} />
</Route>
</Router>,
document.getElementById('app')
)
这样,您就可以传递所有其他路由器的历史记录。
我们需要将 history
作为 prop 传递给 Router
。我期待您使用的是 react router v4 又名 react-router-dom
.
import { createBrowserHistory } from "history";
import { Router } from "react-router-dom";
const history = createBrowserHistory();
...
<Router history={history}>
<Routes />
</Router>
监视 useHistory()
挂钩并提供模拟路由数据。
import routeData from 'react-router';
describe('<Component /> container tests', () => {
beforeEach(() => {
const mockHistory = {
pathname: '/dashboard'
};
jest.spyOn(routeData, 'useHistory').mockReturnValue(mockHistory);
});
如果您在使用 jest
的测试中遇到此错误,您需要将您的组件包装在路由器中。我正在使用 react-testing-library,所以我的逻辑如下所示:
import { render, cleanup } from '@testing-library/react'
import { BrowserRouter as Router } from 'react-router-dom'
import YourComponent from '../path/to/YourComponent'
// ...
describe('YourComponent component', () => {
afterEach(cleanup)
it('matches snapshot', () => {
const { asFragment } = render(
// The following will solve this issue
<Router>
<YourComponent />
</Router>
)
expect(asFragment()).toMatchSnapshot()
})
})
我正在构建一个样式指南应用程序。我有两个下拉组件,用户可以在其中选择品牌和组件 - 然后应用程序将显示根据 selected 品牌标记的所选组件。我希望这两个选项都包含在 URL.
中以编程方式更改路线的两个下拉菜单。我收到错误 TypeError: Cannot read 属性 'history' of undefined 每当用户与任一下拉菜单交互时。
我有一个组件被路由渲染:
<Route path="/:brand/:component"
render={props => <DisplayComponent {...props} />} />
该组件有两个下拉组件的两个事件处理程序,让用户 select 根:
handleComponentPick(event: any) {
const component = event.target.value;
this.props.history.push(`/${this.props.match.params.brand}/${component}`);
}
handleBrandChange = (event: any) => {
if (event.target instanceof HTMLElement) {
const brand = event.target.value;
this.props.history.push(`/${brand}/${this.props.match.params.component}`);
}
};
render = () => {
return (
<div className={"constrain-width-wide center "}>
<ThemePicker
component={this.props.match.params.component}
brand={this.props.match.params.brand}
handleBrandChange={this.handleBrandChange}
handleComponentPick={this.handleComponentPick}
/>
<div className="currently-selected-component" />
<Route path="/:brand/button" component={Button} />
<Route path="/:brand/card" component={Card} />
</div>
);
};
}
我将整个应用程序包装在 Router
。
ReactDOM.render(
<Router>
<App />
</Router>,
document.getElementById("root")
);```
你能试试下面这些改变吗
handleComponentPick(event: any) {
至 handleComponentPick = (event: any) => {
然后
render = () => {
至 render() {
希望这有效。
你必须像
一样传递历史 <Router history={browserHistory} routes={routes} />,
这样,您就可以使用带有道具的历史记录进行导航。
字体:https://github.com/ReactTraining/react-router/blob/v3/docs/guides/Histories.md
尝试在你身上使用 browserHistory app.js,喜欢
render(
<Router history={browserHistory}>
<Route path='/' component={App}>
<IndexRoute component={Home} />
<Route path='about' component={About} />
<Route path='features' component={Features} />
</Route>
</Router>,
document.getElementById('app')
)
这样,您就可以传递所有其他路由器的历史记录。
我们需要将 history
作为 prop 传递给 Router
。我期待您使用的是 react router v4 又名 react-router-dom
.
import { createBrowserHistory } from "history";
import { Router } from "react-router-dom";
const history = createBrowserHistory();
...
<Router history={history}>
<Routes />
</Router>
监视 useHistory()
挂钩并提供模拟路由数据。
import routeData from 'react-router';
describe('<Component /> container tests', () => {
beforeEach(() => {
const mockHistory = {
pathname: '/dashboard'
};
jest.spyOn(routeData, 'useHistory').mockReturnValue(mockHistory);
});
如果您在使用 jest
的测试中遇到此错误,您需要将您的组件包装在路由器中。我正在使用 react-testing-library,所以我的逻辑如下所示:
import { render, cleanup } from '@testing-library/react'
import { BrowserRouter as Router } from 'react-router-dom'
import YourComponent from '../path/to/YourComponent'
// ...
describe('YourComponent component', () => {
afterEach(cleanup)
it('matches snapshot', () => {
const { asFragment } = render(
// The following will solve this issue
<Router>
<YourComponent />
</Router>
)
expect(asFragment()).toMatchSnapshot()
})
})