javascript - React Router - Kan inte läsa egenskapen 'history' av odefinierad


Jag bygger en stilguide-app. Jag har två rullgardinskomponenter där en användare kan välja både ett varumärke och en komponent - appen kommer då att visa den valda komponenten märkt enligt det valda varumärket. Jag vill att båda dessa alternativ ska inkluderas i URL:en.

De två rullgardinsmenyerna som programmässigt ändrar rutten. Jag får felet TypeError: Cannot read property 'history' of undefined varje gång användaren interagerar med någon av rullgardinsmenyerna.

Jag har en komponent som renderas av en rutt:

<Route path="/:brand/:component"
render={props => <DisplayComponent {...props} />} />

Den komponenten har två händelsehanterare för två rullgardinskomponenter som låter användaren välja roten:

  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>
    );
  };
}

Jag kapslar in hela appen i Router.

ReactDOM.render(
  <Router>
    <App />
  </Router>,
  document.getElementById("root")
);```

Svar #1

Om du får detta felmeddelande i ett test som använder jest måste du omsluta din komponent med en router. Jag använder react-testing-library, så min logik ser ut som följer:

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

Svar #2

Kan du prova följande ändringar handleComponentPick(event: any) { till handleComponentPick=(event: any) => { sedan render =() => { till render() { Hoppas detta fungerar.