Вы не должны использовать Route вне Router после использования withRouter - PullRequest
1 голос
/ 27 мая 2019

Мне нужно использовать this.props.history.push ('/ ...') во вложенном компоненте, поэтому я добавил withRouter () , чтобы перемещаться без проблем с историей с помощью response-router-dom.

Но так как я добавил с помощью Router, у меня есть Вы не должны использовать Route за пределами Router error. Я читал сообщения об этой ошибке, но не могу понять, что не так с моим кодом.

Root.js:

import { BrowserRouter as Router, Route, Switch, Redirect, withRouter} from 'react-router-dom'
...
const Root = ({ store }) => (
          <Router>
            <Provider store={store}>
                <StripeProvider apiKey="pk_test_XXXXXXXXX">
                  <Switch>
                      <Route exact path="/" component={App} />
                      <Route path="/comp1" component={Comp1} />
                      <Route path="/comp2" component={Comp2} />
                      <Route path="/store" component={MyStoreCheckout} />
                      <Route component={Notfound} />
                  </Switch>
                </StripeProvider>
             </Provider>
          </Router>
)
Root.propTypes = {
  store: PropTypes.object.isRequired
}
export default withRouter(Root)

и index.js:

import { createStore } from 'redux'
import myReducer from './redux/Reducers/myReducer'
import Root from './Root'
import Store from './redux/Store/store'

render(<Root store={Store} />, document.getElementById('root'))

Я использую withRouter, чтобы иметь возможность вызывать this.props.history (...) в CheckoutForm MyStoreCheckout.js:

class MyStoreCheckout extends React.Component {
  render() {
    return (
      <Elements>
        <InjectedCheckoutForm />
      </Elements>
    );
  }
}
export default MyStoreCheckout;

CheckoutForm.js:

class CheckoutForm extends React.Component {
  handleSubmit = () => {
    fetch(getRequest)
        .then((response) => response.json())
        .then(...)
        .then(() => this.goToSuccessPage())
  }

  goToSuccessPage(){
    this.props.history.push('/') ; //----- error is here if I have no withRouter

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <DetailsSection/>
        <CardSection />
        <button>Confirm order</button>
      </form>
    );
  }
}

export default injectStripe(CheckoutForm);

1 Ответ

1 голос
/ 27 мая 2019

Как я уже упоминал в своем комментарии ... Просто импортируйте withRouter вверху файла CheckoutForm, а затем оберните экспорт им внизу. Как это:

CheckoutForm.js:

import { withRouter} from 'react-router-dom'

class CheckoutForm extends React.Component {
  // ... your class code ...
}

export default withRouter(injectStripe(CheckoutForm));

Если ваш injectStripe HOC не передает все реквизиты с withRouter до CheckoutForm, вы можете вместо этого попробовать export default injectStripe(withRouter(CheckoutForm));, но порядок не должен иметь значения (если настроен правильно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...