如何使用变量在 React 中导入组件或文件?

Posted

技术标签:

【中文标题】如何使用变量在 React 中导入组件或文件?【英文标题】:How to import a component or file in React using variables? 【发布时间】:2017-11-01 20:39:05 【问题描述】:

我正在使用 React 构建一个 Web 应用程序,它显示了您在已选择的校园中选择的建筑物的蓝图。

我有一个“内容”组件,用于加载校园或建筑地图,具体取决于您的选择。 “BuildingMap”组件需要根据您选择的建筑物加载特定的蓝图。它获取带有建筑物名称的 props.building,但我不知道如何使用该变量加载组件。

我尝试过 import、fetch 和 require,但似乎没有任何效果。

请帮忙。

我的代码如下所示:

//内容组件

<BuildingMap building=selectedBuilding campus=selectedCampus />

//建筑地图组件

import *MyBlueprint* from (specific folder depending on the campus selected)

class BuildingMap extends React.Component 
  render()
    return (
      <div className="blueprint" id=this.props.building>
         *MyBlueprint*
      </div>
    )
  

【问题讨论】:

是否需要在运行时加载模块,而不是将组件打包到对象中并通过键引用它们?后者更为常见。 【参考方案1】:

很遗憾,您不能在 React 环境中动态导入/需要组件。

根据建筑物/蓝图的数量,可以一一导入,创建组件构建图,通过建筑物ID选择组件。

如果要加载许多/无限的组件,我肯定会选择另一种方法 - 不知道您的问题的内容。

import BlueprintA from './BlueprintA'
import BlueprintB from './BlueprintB'
import BlueprintC from './BlueprintC'
// ...

class BuildingMap extends React.Component 
  render()
    const C = 
      buildingA: BlueprintA,
      buildingB: BlueprintB,
      buildingC: BlueprintC,
      // ...
    [this.props.building]

    return (
      <div className="blueprint" id=this.props.building>
         <C />
      </div>
    )
  

【讨论】:

动态加载模块是可能的,但对于这种情况肯定更罕见,您的解决方案在 99% 的情况下都很好。我还将对象构造放在组件之外,以防它可以在其他地方使用。一个不错的选择可能是import * as blueprints from .. 好吧,我的意思是不可能动态导入/需要模块 - 通过变量的值,例如导入所有命名模块是这里的选项。感谢您提及:) 可以动态地请求模块,尽管使用变量名。例如:github.com/NCI-GDC/portal-ui/blob/relay/src/packages/%40ncigdc/… 抱歉这个菜鸟问题,但这是什么意思? const C = buildingA: BlueprintA, // ... [this.props.building]最后一点没看懂,[this.props.building]是什么意思?【参考方案2】:

添加到@Andreyco 的答案:

对组件类使用字符串 ID/名称的查找表是一个典型的 React 习惯用法。一个常见的用例是模态管理器组件,它可以呈现多种不同类型的模态。有关示例,请参阅 Dan Abramov 在 "How can I render a modal dialog in Redux?" 的回答(不是 Redux 特定的),以及我的 React/Redux links list 的 React Component Patterns#Modal Dialogs 和 Redux Techniques#UI 部分中的一些相关文章。

根据@azium 的评论:绝对可以使用动态导入(通过require.ensure() 或新的import() 函数)在运行时加载块,您可以将这些动态导入块的导出添加到查找表中当它们被加载时。

【讨论】:

【参考方案3】:

这个问题已经很老了,但是当我在寻找如何解决同样的问题时,让我给出我的答案。可以通过动态导入 React.lazy 来完成:

const OtherComponent = React.lazy(() => import('./OtherComponent'));

在此处查看更多详细信息:https://reactjs.org/docs/code-splitting.html#reactlazy

【讨论】:

以上是关于如何使用变量在 React 中导入组件或文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 组件中导入图像(.svg、.png)

如何在 React 应用程序的 typescript 文件中导入 js 模块(使用绝对路径)?

在 React TypeScript 组件中导入 Javascript

在 Next/React 组件中导入 global vs getStaticProps

如何在打字稿中导入 react-cookie

如何在 React Native 中导入 i18next?