You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过变量动态加载与props名称匹配的React组件?

动态渲染React组件解决方案

方法一:创建组件映射对象(推荐)

先在buildings.js中导出一个包含所有组件的映射对象,方便通过名称直接访问:

// buildings.js
export const NewBuilding = () => {
  return (
    <div className="wrapper">New Building</div>
  )
}

export const Barracks = () => {
  return (
    <div className="wrapper">Barracks</div>
  )
}

// 统一导出组件映射
export const BuildingComponents = {
  NewBuilding,
  Barracks
}

然后在BuildingContent组件中导入该映射对象,通过props传入的名称动态获取并渲染组件:

import { BuildingComponents } from './buildings.js';

class BuildingContent extends React.Component {
  render() {
    const targetComponentName = this.props.content.name;
    // React组件变量必须大写开头,否则会被识别为原生HTML标签
    const TargetBuilding = BuildingComponents[targetComponentName];

    // 处理不存在的组件,避免页面报错
    if (!TargetBuilding) {
      return <div className='building-content-wrapper'>未找到对应建筑组件</div>;
    }

    return (
      <div className='building-content-wrapper'>
        <TargetBuilding />
      </div>
    )
  }
}

方法二:直接导入所有导出内容

如果不想手动维护映射对象,可以直接用import * as导入buildings.js的所有导出内容:

import * as BuildingComponents from './buildings.js';

class BuildingContent extends React.Component {
  render() {
    const TargetBuilding = BuildingComponents[this.props.content.name];

    if (!TargetBuilding) {
      return <div className='building-content-wrapper'>未找到对应建筑组件</div>;
    }

    return (
      <div className='building-content-wrapper'>
        <TargetBuilding />
      </div>
    )
  }
}

关键注意事项

  • 组件变量必须大写开头:React会将小写开头的元素判定为原生HTML标签,因此存储组件的变量名首字母必须大写。
  • 添加异常处理:务必判断目标组件是否存在,避免传入无效名称导致页面崩溃。

内容的提问来源于stack exchange,提问作者redmaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:01:10