简体   繁体   English

使用 React Router 为不同的路由使用相同的组件

[英]Using the same component for different Routes with React Router

I have a PageBuilder component that dynamically builds edit/list pages according to a configuration file.我有一个PageBuilder组件,它根据配置文件动态构建编辑/列表页面。 I want to have dynamic routes (like "/collection/list", "/collection/edit/123123", "/dashboard", etc.) that use the same PageBuilder component.我想要使​​用相同PageBuilder组件的动态路由(如“/collection/list”、“/collection/edit/123123”、“/dashboard”等)。

I'm having trouble getting this to work - if I'm in "/collection/list" for example, when clicking on a link to "/collection/edit/1231" doesn't work.我无法让它工作 - 例如,如果我在“/collection/list”中,当单击指向“/collection/edit/1231”的链接不起作用时。 Only a refresh to that URL works (and vice-versa).只有对该 URL 的刷新才有效(反之亦然)。

I tried putting my initialization code PageBuilder 's componentWilLReceiveProps but it seems to call it every second.我试着把我的初始化代码PageBuildercomponentWilLReceiveProps但它似乎每秒调用一次。

My routes look like this:我的路线如下所示:

<Route path="/" component={App}>
  <IndexRedirect to="/dashboard" />
  <Route path="/:page/:collection/:action(/:entity_id)" component={PageBuilder}  />
  <Route path="/:page" component={PageBuilder} />
</Route>

And my PageBuilder:还有我的 PageBuilder:

constructor(props) {
    super(props);
    this.createSectionsHTML = this.createSectionsHTML.bind(this);
    this.onChange = this.onChange.bind(this);
    this.onSave = this.onSave.bind(this);
}

getPageName() {
    return this.props.params.page.replace(/-/g, '_').toLowerCase();
}

componentWillReceiveProps(props) {
    this.action = this.props.params.action;
}

componentWillMount() {
    let pageName = this.getPageName();
    this.props.dispatch(setInitialItem(pageName));
}

componentDidMount() {

    let pageName = this.getPageName();
    let { collection, entity_id } = this.props.params;

    if (collection && entity_id) {
        let { dispatch } = this.props;
        dispatch(getCollectionEntity(collection, entity_id, pageName));
    }
}

Any ideas of how to re-render the page each time I redirect to a different route?关于每次重定向到不同路线时如何重新呈现页面的任何想法?

It would be great if I could unmount and re-mount the component when redirecting, but I'm not sure how to go about telling React Router to do that....如果我可以在重定向时卸载并重新安装组件,那就太好了,但我不确定如何告诉 React Router 这样做......

Thanks!谢谢!

Make this.state such that it will control how your component gets rendered.使this.state可以控制组件的渲染方式。

Now, within componentWillReceiveProps , check the nextProps argument现在,在componentWillReceiveProps ,检查nextProps参数

componentWillReceiveProps(nextProps, nextState) {
  if( <check in nextProps if my route has changed> ) {
    let newState = Object.assign({}, this.state);
    // make necessary changes to the nextState Object by calling
    // functions which would change the rendering of the current page
    this.setState({ nextState });
  }
}

This would make componentWillReceiveProps take action only when the route changes.这将使componentWillReceiveProps仅在路由更改时采取行动。

Now in your render function,现在在你的渲染函数中,

render() {
  const { necessary, variables, to, render } = this.state;
  let renderVariables = this.utilityFunctionsReqToRender(someArgs);
  return (
    <toRenderJsx>
      ...
    </toRenderJsx>
  )
}

This would make your component "refresh" whenever the route changes.这将使您的组件在路由更改时“刷新”。

componentWillReceiveProps is deprecated since React 16.3.0 (as says a warning in the browser console) componentWillReceiveProps 自 React 16.3.0 起已弃用(如浏览器控制台中的警告所示)

Reference : https://reactjs.org/docs/react-component.html#componentdidupdate参考: https : //reactjs.org/docs/react-component.html#componentdidupdate

So componentDidUpdate can be used to get the new state and reload data depending on params因此componentDidUpdate可用于获取新状态并根据参数重新加载数据

componentDidUpdate(prevProps, prevState, snapshot) {
    console.log("componentDidUpdate " +prevState.id);
    reloadData(prevState.id);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM