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>

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

监视 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()
  })
})