React Router-无法读取未定义的属性“历史”

时间:2019-03-04 11:09:00

标签: javascript reactjs typescript react-router react-router-v4

我正在构建样式指南应用程序。我有两个下拉组件,用户可以在其中选择品牌和组件-应用程序将根据所选品牌显示所选组件的商标。我希望这两个选项都包含在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")
);```

5 个答案:

答案 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>

演示:https://codesandbox.io/s/yv5y905ojv

答案 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()
  })
})