我正在构建样式指南应用程序。我有两个下拉组件,用户可以在其中选择品牌和组件-应用程序将根据所选品牌显示所选组件的商标。我希望这两个选项都包含在URL中。
以编程方式更改路线的两个下拉菜单。我收到错误TypeError:每当用户与任一下拉列表进行交互时,都无法读取未定义的属性“ history”。
我有一个通过路线渲染的组件:
<Route path="/:brand/:component"
render={props => <DisplayComponent {...props} />} />
该组件具有两个下拉菜单组件的两个事件处理程序,可让用户选择根目录:
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")
);```
答案 0 :(得分:1)
您可以尝试以下更改吗?
handleComponentPick(event: any) {
至handleComponentPick = (event: any) => {
然后
render = () => {
至render() {
希望这行得通。
答案 1 :(得分:0)
您必须像这样传递历史
<Router history={browserHistory} routes={routes} />,
那样,您可以将历史记录与道具一起使用。
字体:https://github.com/ReactTraining/react-router/blob/v3/docs/guides/Histories.md
尝试在您的app.js上使用browserHistory,例如
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')
)
那样,您正在传递所有其他路由器的历史记录。
答案 2 :(得分:0)
我们需要将history
作为对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>
答案 3 :(得分:0)
在useHistory()
钩上侦听并提供了模拟路线数据。
import routeData from 'react-router';
describe('<Component /> container tests', () => {
beforeEach(() => {
const mockHistory = {
pathname: '/dashboard'
};
jest.spyOn(routeData, 'useHistory').mockReturnValue(mockHistory);
});
答案 4 :(得分:0)
如果在使用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()
})
})