广告
返回顶部
首页 > 资讯 > 精选 >React远程动态组件怎么实现
  • 745
分享到

React远程动态组件怎么实现

2023-07-05 16:07:00 745人浏览 薄情痞子
摘要

这篇文章主要介绍了React远程动态组件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React远程动态组件怎么实现文章都会有所收获,下面我们一起来看看吧。远程动态组件实现远程动态组件库远程动态组件库项

这篇文章主要介绍了React远程动态组件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React远程动态组件怎么实现文章都会有所收获,下面我们一起来看看吧。

    远程动态组件实现

    远程动态组件库

    远程动态组件库项目结构如下所示:

    .├── babel.config.js├── package.JSON├── rollup.config.js└── src    ├── Button.js    ├── Text.js

    我们简单实现了两个组件 ButtonText

    import React from 'react'export default ({children}) => {  return <button style={{color: 'blue'}}>{children}</button>}
    import React from 'react'export default ({children}) => {  return <span style={{color: 'blue'}}>{children}</span>}

    我们使用 rollup 对其进行打包,之所以用 rollup 是因为其打包出来的代码非常简洁,方便我们查看,rollup 配置为:

    import babel from 'rollup-plugin-babel'import fs from 'fs'const components = fs.readdirSync('./src')export default components.map((filename) => {  return {    input: `./src/${filename}`,    output: {      file: `dist/${filename}`,      fORMat: 'cjs',    },    plugins: [babel()],  }})

    打包后的结果如下所示:

    .├── dist│   └── Button.js│   └── Text.js

    其中 Button.js 如下所示:

    'use strict'var React = require('react')function _interopDefaultLegacy(e) {  return e && typeof e === 'object' && 'default' in e ? e : {default: e}}var React__default =  _interopDefaultLegacy(React)var Button = function (_ref) {  var children = _ref.children  return  React__default['default'].createElement(    'button',    {      style: {        color: 'blue',      },    },    children  )}module.exports = Button

    然后我们使用 Http-server 在 dist 目录下开启一个静态文件服务,则可以通过 http://localhost:8080/Button.js 获取到打包后的代码。

    远程组件库介绍完毕,接下来介绍业务项目中如何使用。

    接入远程组件库

    我们使用 create-react-app 创建一个 React 应用,并新增一个 DynamicComponent 组件:

    const DynamicComponent = ({name, children, ...props}) => {  const Component = useMemo(() => {    return React.lazy(async () => fetchComponent(name))  }, [name])  return (    <Suspense      fallback={        <div style={{alignItems: 'center', justifyContent: 'center', flex: 1}}>          <span style={{fontSize: 50}}>Loading...</span>        </div>      }>      <Component {...props}>{children}</Component>    </Suspense>  )}export default React.memo(DynamicComponent)

    这里使用到了 React 中的 Suspense 组件和 React.lazy 方法,关于他们的用法这里不做过多解释,整个 DynamicComponent 组件的含义是远程加载目标组件,这个过程该组件会渲染传入 Suspense 参数 fallback 之中的内容,最后会使用加载成功的组件进行替换。接下来看看 fetchComponent 是如何实现的:

    const fetchComponent = async (name) => {  const text = await fetch(    `http://127.0.0.1:8080/${name}.js?ts=${Date.now()}`  ).then((a) => {    if (!a.ok) {      throw new Error('Network response was not ok')    }    return a.text()  })  const module = getParsedModule(text, name)  return {default: module.exports}}

    该方法会发起网络请求得到组件的代码,并交给 getParsedModule 去解析,最后得到模块返回。我们来看一下 getParsedModule 是怎么实现的:

    const packages = {  react: React,}const getParsedModule = (code) => {  let module = {    exports: {},  }  const require = (name) => {    return packages[name]  }  Function('require, exports, module', code)(require, module.exports, module)  return module}

    这里使用 Function 来运行传入的代码,因为打包远程组件的时候并没有将 react 库打包进去,所以这里需要实现 require 这个方法。

    我们结合之前打包得到的 Button.js 来看这段代码,它其实同下面这个代码是等价的:

    const packages = {  react: React,}const getParsedModule = (code, moduleName) => {  let module = {    exports: {},  }  const require = (name) => {    return packages[name]  }  ;((require, exports, module) => {    'use strict'    var React = require('react')    function _interopDefaultLegacy(e) {      return e && typeof e === 'object' && 'default' in e ? e : {default: e}    }    var React__default =  _interopDefaultLegacy(React)    var Button = function (_ref) {      var children = _ref.children      return  React__default['default'].createElement(        'button',        {          style: {            color: 'blue',          },        },        children      )    }    module.exports = Button  })(require, module.exports, module)  return module}

    最后我们可以按照如下方式来使用 DynamicComponent 组件:

    import DynamicComponent from './DynamicComponent'function App() {  return (    <div>      <DynamicComponent name='Button'>Click Me</DynamicComponent>      <DynamicComponent name='Text'>Remote Component</DynamicComponent>    </div>  )}export default App

    现在我们尝试修改远程动态组件库中的组件,重新打包后就可以马上看到修改后的效果了。

    关于“React远程动态组件怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“React远程动态组件怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: React远程动态组件怎么实现

    本文链接: https://www.lsjlt.com/news/353572.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • React远程动态组件怎么实现
      这篇文章主要介绍了React远程动态组件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React远程动态组件怎么实现文章都会有所收获,下面我们一起来看看吧。远程动态组件实现远程动态组件库远程动态组件库项...
      99+
      2023-07-05
    • React实现动态调用的弹框组件
      最近在用react开发项目,遇到一个需求——开发一个弹框组件。在react中创建一个组件是很简单的,只需要使用class创建并引入就可以了,但是要做到可以用j...
      99+
      2022-11-13
    • react怎么改变组件状态
      本教程操作环境:Windows7系统、react18版、Dell G3电脑。一、有状态组件和无状态组件1.先理解一下什么是状态:定义:是用来描述事物在某一时刻的形态的数据 , 一般称为state。(可以简单理解为状态就是数据)例如:9月2...
      99+
      2023-05-14
      组件状态 前端 React.js
    • Angular.js怎么实现动态加载组件
      小编给大家分享一下Angular.js怎么实现动态加载组件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言有时候需要根据URL...
      99+
      2022-10-19
    • React实现动效弹窗组件
      我们在写一些 UI 组件时,若不考虑动效,就很容易实现,主要就是有无的切换(类似于 Vue 中的 v-if 属性)或者可见性的切换(类似于 Vue 中的 v-show 属性)。 1...
      99+
      2022-11-12
    • react如何实现组件状态缓存
      这篇文章主要介绍“react如何实现组件状态缓存”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react如何实现组件状态缓存”文章能帮助大家解决问题。一、安装第三方库npm i ...
      99+
      2023-07-05
    • React组件状态下移和内容提升怎么实现
      本篇内容介绍了“React组件状态下移和内容提升怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言两个简单实用的优化组件渲染性能的方...
      99+
      2023-07-04
    • React Native中怎么实现动态导入
      这篇文章主要介绍“React Native中怎么实现动态导入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React Native中怎么实现动态导入”文章能帮助大家解决问题。背景...
      99+
      2023-07-02
    • React 组件间怎么实现通信
      本篇文章给大家分享的是有关React 组件间怎么实现通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。父子组件通讯通讯手段这是最常见的通信方式...
      99+
      2022-10-19
    • vue中怎么实现父组件向子组件动态传值
      这篇文章将为大家详细讲解有关vue中怎么实现父组件向子组件动态传值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法有两种,方法一:props传值,这里注意...
      99+
      2022-10-19
    • React中怎么实现状态自动保存
      这篇文章给大家介绍React中怎么实现状态自动保存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 什么是状态保存?假设有下述场景:移动端中,用户访问了一个列表页,上拉浏览列表...
      99+
      2022-10-19
    • Vue中的动态组件怎么实现渲染
      本篇内容介绍了“Vue中的动态组件怎么实现渲染”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是动态组件动态组件指的是动态切换组件的显...
      99+
      2023-06-30
    • Vue和React组件怎么实现传值
      本篇文章为大家展示了Vue和React组件怎么实现传值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。组件间的传值方式组件的传值场景无外乎以下几种:父子之间兄弟之间多...
      99+
      2022-10-19
    • C++怎么实现动态数组
      本篇内容介绍了“C++怎么实现动态数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!动态数组动态数组Vector可以动态扩展内存,其采用连续...
      99+
      2023-07-02
    • React中怎么实现受控组件与非受控组件
      本篇文章给大家分享的是有关React中怎么实现受控组件与非受控组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。受控组件与非受控组件是Reac...
      99+
      2022-10-19
    • React中怎么实现Portal可复用组件
      这篇文章给大家介绍React中怎么实现Portal可复用组件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、通常你的网站只有一个root<body>  <...
      99+
      2022-10-19
    • React中怎么实现组件内部通信
      React中怎么实现组件内部通信,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。2. 组件内部数据传递React 组件内部通信主要分为两部分...
      99+
      2022-10-19
    • React中怎么实现父子组件传递
      React中怎么实现父子组件传递,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。React的组件生命周期react主要思想是构建可复用组件来构建...
      99+
      2022-10-19
    • React中怎么实现组件逻辑复用
      React中怎么实现组件逻辑复用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. MixinsMixins 事实上是 Rea...
      99+
      2022-10-19
    • React源码中怎么实现受控组件
      本篇内容主要讲解“React源码中怎么实现受控组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React源码中怎么实现受控组件”吧!在React中一个简单的受...
      99+
      2022-10-19
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作