返回顶部
首页 > 资讯 > 精选 >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://lsjlt.com/news/353572.html(转载时请注明来源链接)

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

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

    • 微信公众号

    • 商务合作