react根据后台返回的组件路径动态的引入组件(react动态加载组件)

摘要:
所以就想到了哪些数据都由后台返回,前端只需要根据后台返回的路径动态的引入组件。//在componentDidMount我们只是简单地调用importComponent函数,并将动态加载的组件保存在状态中。

搭建react项目时,刚开始路由的配置文件都是写死的,每写一个组件然后都需要自己去路由的配置文件中进行配置路由。其实刚开始觉得也很正常,因为动态import感觉很难实现。但是项目需求后台需要记录那些组件的路径以及路由 跳转的路径。所以就想到了哪些数据都由后台返回,前端只需要根据后台返回的路径动态的引入组件。

一开始后台返回的是完整路径,比如说自己写的组件在pages目录下,然后在routers目录中的Index.jsx中引入组件,即‘../pages/header/Header.jsx’,然后后台就给返回‘../pages/header/Header.jsx’这个路径,如图:

react根据后台返回的组件路径动态的引入组件(react动态加载组件)第1张

实际上是不行的,代码如下:

<Switch>
{this.state.RouterData && this.state.RouterData.map((item, index) =>{   return <Route key={index} path={item.path} component={asyncComponent(() => import(item.component))}></Route>})}
{
/*重定向 */} <Route path='/' exact render={() =>(   <Redirect to="/header" />)} />
{/*错误路径跳转的组件 */} <Route component={ErrorView} />
</Switch>

这样引入的话会报找不到这个组件,然后就一直想是什么问题,这样写感觉也没什么问题,但是确实是报错找不到这个组件,解决方法就是后台不能返回这个完整路径,只能返回这个组件在哪个位置:比如在pages下的header文件夹中的Header.jsx,就只能返回‘pages/header/Header.jsx’,这样的话我们在引入组件时做一个字符串拼接就可以找到这个组件了,代码如下:

<Switch>
{this.state.RouterData && this.state.RouterData.map((item, index) =>{     return <Route key={index} path={item.path} component={asyncComponent(() => import('../' +item.component))}></Route>
})}
{/*重定向 */}
  <Route path='/' exact render={() =>(
    <Redirect to="/header" />)} />
{/*错误路径跳转的组件 */}   <Route component={ErrorView} /> </Switch>

注意,this.state.RouterData是后台返回来的数据然后保存在state中的,asyncComponent是异步加载组件的一个方法,代码如下:

import React from 'react';

//这个asyncComponent函数接受一个importComponent的参数,importComponent调用时候将动态引入给定的组件。
//在componentDidMount我们只是简单地调用importComponent函数,并将动态加载的组件保存在状态中。
//最后,如果完成渲染,我们有条件地提供组件。如果不写null的话,也可提供一个loading,代表着组件正在渲染。
export defaultfunction asyncComponent(importComponent) {
    class AsyncComponent extendsReact.Component {
        constructor() {
            super();

            this.state ={
                component: null}
        }

        async componentDidMount() {
            const { default: component } =await importComponent();

            this.setState({component: component})
        }

        render() {
            const C = this.state.component;

            return C ? <C {...this.props} /> : null;
        }
    }

    returnAsyncComponent;
}

这样就完成了异步加载组件啦,有什么还不明白的可以加我QQ: 1274668609

免责声明:文章转载自《react根据后台返回的组件路径动态的引入组件(react动态加载组件)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇App性能优化浅谈微服务技术选型之路下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

React事件机制

一、是什么 React基于浏览器的事件机制自身实现了一套事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等 在React中这套事件机制被称之为合成事件 合成事件(SyntheticEvent) 合成事件是 React模拟原生 DOM事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器 根据 W3C规范来定义合成事件,兼容所有浏览器,拥有与浏...

我们为什么需要 lock 文件

前言 从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的。 为什么需要 lock 文件 之所以需要 lock 文件,我觉得主要有 4 个...

一站式Web开发套件BeetleX.WebFamily

          BeetleX.WebFamily是一款前后端分离的Web开发套件,但它并不依赖于nodejs/npm/webpack等相关工具;而使用自身实现的方式来完成前后端分离的Web应用开发;套件以组件的方式发布,只需要在项目引用相关组件即可实现前后端分离开发,开发出来的项目可直接部署在装用.NetCore的Linux和Windows系统上。...

Echarts学习之路3(在react中使用)

安装: npm install echarts --save demo import React, { Component } from 'react'; // 引入 ECharts 主模块 import echarts from 'echarts/lib/echarts'; // 引入柱状图 import 'echarts/lib/chart/bar'...

react 监听页面滚动

1. onScrollCapture html: // 如果使用typescript, 定义dom类型 private dom: HTMLDivElement | null // ReactJS中,对Div监听只需要绑定 onScrollCapture事件 <div style={{ flex: 1,...

一步步带你做vue后台管理框架(一)——介绍框架

系列教程《一步步带你做vue后台管理框架》第一课 github地址:vue-framework-wz 线上体验地址:立即体验 《一步步带你做vue后台管理框架》第一课:介绍框架 《一步步带你做vue后台管理框架》第二课:上手使用 《一步步带你做vue后台管理框架》第三课:登录功能 Features 特性 ?wz脚手架?(脚手架助你安装/卸载组件更方便...