【问题标题】:React Dynamically download Components and get data from all child componentsReact 动态下载组件并从所有子组件中获取数据
【发布时间】:2023-03-25 17:59:01
【问题描述】:

我是新手,这更像是我打算解决的设计问题
1) 从静态托管站点下载组件并显示它们。
2)通过(比方说)下载选项从组件中获取所有数据

根据我的实践,我了解到父组件将回调/onChangehandle 作为道具传递给子组件,并且它维护子组件状态的副本,尽管子组件呈现 HTML。但是,我想根据用户的输入从 API/静态托管动态下载组件,然后从所有这些组件中获取数据的字符串表示/状态。每个组件都有不同的状态数据,因此我无法编写通用的 onChangehandle。

问题:-

1) 这样的设计是否可以通过 react 实现?每个组件都可以将其库上传到云端吗?

2) 我们可以强制在每个组件上编写方法,以便父级可以调用每个组件的特定方法并获取数据吗?

我正在寻找的伪代码:-

class Parent extends Component {
    downloadData = (event) => {
        for(childComponents 1 to n){
            all_data += childComponent.getState()
        }
        pdf(all_data)
    }

    render(){
        // Render Child components
        for(childComponents 1 to n) {
        ChildComponent = // Load from API/Static hosting
        }
        <button onClick="downloadData"/>
    }
}

【问题讨论】:

  • 你的意思是类似于服务器端渲染的东西吗?
  • 不,客户端呈现,但它动态加载组件。想象这些是不同类型的插件。一个可以是图表,一个可以是表格等。每个组件都会调用自己的后端 API,获取数据并显示。
  • 这能回答你的问题吗? storyblok.com/tp/…
  • 谢谢,让我通读一遍
  • 我发现 react lazy 和 react-dynamic-import 可以动态导入组件。但我只能从 src/ 目录中执行此操作。 npmjs.com/package/react-dynamic-import这里不是./realComponent.js,有什么办法可以指定组件的URL吗?但是,URL 中的 react 库不应该在转译的 js 中。

标签: reactjs


【解决方案1】:

你想要完成的事情绝对是可能的。我不是很喜欢类组件,所以我用反应钩子写了这个例子。

您可以执行以下操作来从外部组件加载数据:将回调传递到您在成功加载时调用的组件以接收数据。尽管如此,我不建议这样做。我会从与组件不同的 api 获取数据。您应该始终将数据拆分为可视化和代表用户界面的组件。

加载外部反应模块的代码:

import React, { useEffect, useState, useRef } from 'react'

export function Loader({ id }) {
  const [loading, setLoading] = useState(true)
  const ref = useRef()

  const [data, setData] = useState({})

  useEffect(() => {
    async function fetchReactComponent() {
      await import(
        /*webpackIgnore: true*/ `https://example.com/react-components/${id}`
      ).then(module => {
        setLoading(false)
        const node = module["ReactComponent"](data, setData)

        if (ref.current) {
          ref.current.innerHTML = ''
          if (typeof node === 'string') {
            ref.current.innerHTML = node
          } else {
            ref.current.appendChild(node)
          }
        }
      })
    }

    fetchReactComponent()
    // eslint-disable-next-line
  }, [id])

  return loading ? <div>Loading...</div> : <div ref={ref} />
}

外部反应模块:

function ReactComponent(data, setData) {
  // do something with the data
  return '<h1>A component</h1>'
}

export { ReactComponent }

【讨论】:

  • 非常感谢!!这行得通。我正在试验类组件并拥有自己的事件处理程序。我注意到返回只能是一个字符串,否则解析时会出现语法错误。再次感谢:)
  • 你好,我可以在jsx中编写外部组件并在babel编译后webpack吗?外部组件使用 webpack 的导出格式应该是什么?
  • @user3201336 我认为 webpack 目前不支持捆绑单个模块。您可以为此使用捆绑程序 rollup。使用汇总搜索设置反应组件库。通过汇总,您可以捆绑 es6 模块。
  • 非常感谢。我设置了一个汇总配置并创建了一个 es 包。但我得到ReferenceError: react is not defined 下面是为我编写的虚拟类组件创建的捆绑js 前几行。类组件适用于普通导入。只是想知道为什么 import() 失败并出现此错误import React, { Component } from 'react'; function checkDCE() {
  • @user3201336 你必须将 react 包含在 rollup 创建的包中。
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多