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

React中能否在map方法内用来自数据库的state属性渲染组件?

你写的 <{ce.component}/> 语法是错误的,React 不支持这种直接将变量嵌入组件标签的写法,按照你存的内容不同,对应两种解决方案:

情况1:ce.component 存的是 React 组件本身(非字符串)

React 要求自定义组件名必须首字母大写,你只需要先将变量赋值给一个首字母大写的变量即可使用:

const [post, setPost] = useState([]);

<>
  {post.map((ce) => {
    // 赋值给首字母大写的变量
    const RenderComponent = ce.component;
    return (
      <div key={ce._id}>
        <h2>{ce.title}</h2>
        <p>{ce.content}</p>
        {/* 正常使用组件,也可以按需传props */}
        <RenderComponent />
      </div>
    )
  })}
</>

情况2:ce.component 存的是组件名字符串(比如数据库存的是"Button"、"Card"这类文本)

不要用eval转换,会有严重的XSS安全风险,提前建立组件映射表即可:

// 提前导入所有可能用到的组件
import Button from './components/Button';
import Card from './components/Card';
import Banner from './components/Banner';

// 建立字符串和组件的映射关系
const ComponentMap = {
  Button,
  Card,
  Banner
}

const [post, setPost] = useState([]);

<>
  {post.map((ce) => {
    const RenderComponent = ComponentMap[ce.component];
    // 匹配不到对应组件时返回空,避免报错
    if (!RenderComponent) return null;
    return (
      <div key={ce._id}>
        <h2>{ce.title}</h2>
        <p>{ce.content}</p>
        <RenderComponent />
      </div>
    )
  })}
</>

额外注意

你示例代码里的tittle是拼写错误,正确属性名应该是title。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:27:04