Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React路由器4动态组件从数据库动态加载_Reactjs_React Router_React Router V4 - Fatal编程技术网

Reactjs React路由器4动态组件从数据库动态加载

Reactjs React路由器4动态组件从数据库动态加载,reactjs,react-router,react-router-v4,Reactjs,React Router,React Router V4,我正在从2.5.1迁移到React路由器4.11在旧版本中,我的同构/通用应用程序在启动时从数据库中动态检索路由/组件,我希望保留与4.11相同的功能。 在react router的2.5.1版本中,我能够通过调用_createRouter从数据库中动态加载路由和组件,路由参数是从我的数据库中检索到的数据,如下所示: //////////////////////// // from client entry.js //////////////////////// async function m

我正在从2.5.1迁移到React路由器4.11在旧版本中,我的同构/通用应用程序在启动时从数据库中动态检索路由/组件,我希望保留与4.11相同的功能。

在react router的2.5.1版本中,我能够通过调用_createRouter从数据库中动态加载路由和组件,路由参数是从我的数据库中检索到的数据,如下所示:

////////////////////////
// from client entry.js
////////////////////////
async function main() {
  const result = await _createRouter(routes)
  ReactDOM.render(      
      <Provider store={store} key="provider">
        <Router history={history}>
          {result}
        </Router>
      </Provider>
    dest
 );
}

//////////////////////
// from shared modules
//////////////////////
function _createRouter(routes) {
     const childRoutes = [ // static routes, ie Home, ForgotPassword, etc];

      ////////////////////////
      // crucial part here
      ////////////////////////
      routes.map(route => {
        const currComponent = require('../../client/components/' + route.route + '.js');
        const obj = {
          path: route.route,
          component: currComponent
        };
        childRoutes.push(obj)
      });

      childRoutes.push({path: '*', component: NotFoundComponent});
      return { path: '', component: .APP, childRoutes: childRoutes };
    }
////////////////////////
//从client entry.js
////////////////////////
异步函数main(){
const result=wait_createRouter(路由)
ReactDOM.render(
{result}
目的地
);
}
//////////////////////
//来自共享模块
//////////////////////
功能_createRouter(路由){
const childRoutes=[//静态路由,即Home、ForgotPassword等];
////////////////////////
//这里的关键部分
////////////////////////
routes.map(route=>{
const currComponent=require('../../client/components/'+route.route+'.js');
常量对象={
路径:route.route,
组件:currComponent
};
儿童路线推送(obj)
});
push({path:'*',component:NotFoundComponent});
返回{路径:'',组件:。应用程序,childRoutes:childRoutes};
}
在4.11中,我找不到任何关于执行相同事件的文档,对此我感到沮丧。每个示例都显示了硬编码的路线,如下所示:

render() {
    return (
          <Route path='/' component={Home} />
          <Route path='/home' component={About} />
          <Route path='/topics' component={Topics} />
   )
}
render(){
返回(
)
}
这在我看来并不真实,尤其是对于大型应用程序

是否有人能为我指出实现2.5.1和4.11中相同成功的方向,即能够动态地从数据库动态加载我的路由/组件


多谢

在新版本中,每条路线只是一个常规的反应组件。因此,您应该能够像创建任何其他组件一样动态创建路由

render() {
  const { routes } = this.props;

  return (
    <div>
      {
        routes.map(route => <Route path={route.path} component={route.component} />)
      }
    </div>
  );
}
render(){
const{routes}=this.props;
返回(
{
routes.map(route=>)
}
);
}

在尝试渲染路由之前,您还需要动态导入组件。

也许此代码就是解决此问题的方法。“动态路由导入组件”

import-React{
组成部分
}从“反应”;
const Containers=()=>(
Containers
); 类ComponentFactory扩展组件{constructor(props){super(props);this.state={RouteComponent:Containers} 组件willmount(){ const name=this.props.page; 导入('../pages/'+name+'/index')。然后(RouteComponent=>{ 返回此.setState({ RouteComponent:RouteComponent.default }) }).catch(err=>console.log('加载组件失败',err)) } render(){ const{RouteComponent}=this.state; 返回(); } } 导出默认组件工厂 }/>
有动态导入的示例吗?我尝试在组件属性中嵌入require语句,但这种方法不正确。
import React, {
    Component
} from "react";

const Containers = () => ( < div className = "containers" > Containers < /div>);

class ComponentFactory extends Component{constructor(props){super(props);this.state={RouteComponent:Containers}}
    componentWillMount() {
        const name = this.props.page;
        import ('../pages/' + name + '/index').then(RouteComponent => {
            return this.setState({
                RouteComponent: RouteComponent.default
            })
        }).catch(err => console.log('Failed to load Component', err))
    }
    render() {
        const {RouteComponent } = this.state;
        return (<RouteComponent { ...this.props  }/> );
    }
}
export default ComponentFactory



 <Route path="/:page"
        render={rest => <ComponentFactory
        page={rest.match.params.page}
        {...rest}/>}/>