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

Next.js中如何渲染存储为字符串形式的Lucide React图标组件

Next.js中如何渲染存储为字符串形式的Lucide React图标组件

嘿,我完全懂你现在的困扰——把图标写成字符串存在数组里,渲染的时候只会显示成纯文本,根本不会变成预期的图标组件对吧?这是因为React不会自动把字符串解析成JSX代码,直接输出字符串就只会原样显示。咱们换个正确的思路来处理,完全不用字符串存图标,下面给你两种可行的方案:

方案1:直接存储JSX图标元素(简单直接)

这种方式最直观,直接把Lucide图标作为JSX元素存在MenuItems里,不用再处理字符串转换的问题。

第一步:修改MenuItems文件

先导入需要的Lucide图标,然后把icon字段替换成对应的JSX元素:

// MenuItems.js
import { House, ContactRound, Phone } from 'lucide-react';

// 定义你需要的颜色变量,或者直接写颜色值
const black = '#000';

export const MenuItems = [
  {
    label: "Home",
    icon: <House color={black} size={32} />, // 直接存JSX元素
    url: "/",
  },
  {
    label: "About",
    icon: <ContactRound size={32} />,
    url: "/about",
  },
  {
    label: "Contact",
    icon: <Phone size={32} />,
    url: "/contact",
  },
];

第二步:在Menu组件中直接渲染

现在i.icon已经是React可以识别的JSX元素了,直接输出就行:

// Menu.js
import Link from "next/link";
import { MenuItems } from "./MenuItems";

const Menu = () => {
  return (
    <div className=''>
      {MenuItems.map(item => (
        <div className="" key={item.label}>
          <Link href={item.url}>
            {/* 直接渲染图标JSX */}
            {item.icon}
            <span>{item.label}</span>
          </Link>
        </div>
      ))}
    </div>
  );
};
export default Menu;

方案2:存储图标组件+配置props(更灵活)

如果想统一控制所有图标的样式(比如统一改size),或者需要动态传props,这种方式会更合适。我们把图标组件本身存在icon字段,再单独存props配置,渲染的时候动态生成组件。

第一步:修改MenuItems文件

// MenuItems.js
import { House, ContactRound, Phone } from 'lucide-react';

export const MenuItems = [
  {
    label: "Home",
    icon: House, // 存图标组件本身(注意是大写开头的组件名)
    url: "/",
    iconProps: { color: '#000', size: 32 }, // 该图标专属的props
  },
  {
    label: "About",
    icon: ContactRound,
    url: "/about",
    // 可以不写iconProps,用默认配置
  },
  {
    label: "Contact",
    icon: Phone,
    url: "/contact",
  },
];

第二步:在Menu组件中动态渲染

把组件赋值给大写开头的变量(React要求组件名必须大写),然后合并默认props和专属props,再渲染:

// Menu.js
import Link from "next/link";
import { MenuItems } from "./MenuItems";

const Menu = () => {
  // 所有图标默认的props,统一控制
  const defaultIconProps = { size: 32, color: '#000' };

  return (
    <div className=''>
      {MenuItems.map(item => {
        // 把组件赋值给大写开头的变量
        const Icon = item.icon;
        // 合并默认props和当前图标的专属props
        const finalProps = { ...defaultIconProps, ...item.iconProps };
        
        return (
          <div className="" key={item.label}>
            <Link href={item.url}>
              {/* 渲染图标组件,传入合并后的props */}
              <Icon {...finalProps} />
              <span>{item.label}</span>
            </Link>
          </div>
        );
      })}
    </div>
  );
};
export default Menu;

重要提醒:别用dangerouslySetInnerHTML!

可能你会搜到用dangerouslySetInnerHTML来解析字符串成JSX的方法,但绝对不要用!这种方法有严重的XSS安全风险,而且处理组件props会非常麻烦,完全没必要为了这个需求冒风险。

总结一下,核心思路就是:不要把JSX以字符串形式存储,直接用React的方式存储组件或者JSX元素,这样React才能正确识别并渲染它们~

备注:内容来源于stack exchange,提问作者Rey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:24:33