【问题标题】:You should not use Route outside a Router after use of withRouter使用 withRouter 后,您不应在路由器外使用 Route
【发布时间】:2019-10-13 02:48:18
【问题描述】:

我必须在嵌套组件中使用 this.props.history.push('/...') 所以我添加了 withRouter() 以使用 react-router-dom 导航而不会出现历史问题.

但由于我添加了 withRouter,我有 You should not use Route outside a Router 错误。 我已阅读有关此错误的帖子,但我不明白我的代码有什么问题。

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 能够在 CheckoutForm 中调用 this.props.history(...) 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);

【问题讨论】:

  • 是的,withRouter 只能用于嵌套在 &lt;Router&gt; 内的组件中 - 例如,在您的代码中,StripeProviderAppComp1Comp2NotFound
  • @BlunderingPhilosopher 我编辑了我的问题。那么如何使用 withRouter 才能访问 CheckoutForm 中的页面?
  • 只需在CheckoutForm 文件的顶部执行import { withRouter} from 'react-router-dom',然后将injectStripe(CheckoutForm) 包装成这样:withRouter(injectStripe(CheckoutForm))

标签: javascript reactjs react-router-dom


【解决方案1】:

正如我在评论中提到的...只需在 CheckoutForm 文件的顶部导入 withRouter,然后在底部用它包装导出。像这样:

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));,但order shouldn't matter(如果设置正确)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2019-11-27
    • 2019-05-28
    相关资源
    最近更新 更多