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

如何让react-big-calendar事件渲染API返回的React Icons图标?

解决react-big-calendar事件标题中React Icons不渲染的问题

核心问题

React不会把字符串里的JSX标签(比如<FaCircleCheck />)解析成实际组件,只会当成纯文本显示,所以得换一种方式处理图标和标题的关联。

推荐解决方案(规范做法)

1. 调整API返回格式

让API把标题和图标标识分开返回,不要混在同一个字符串里,比如:

{
  "title": "This is the Title",
  "icon": "FaCircleCheck", // 只返回图标组件的名称
  "start": "...",
  "end": "..."
}

2. 建立图标组件映射表

把你用到的React Icons组件和对应的名称做映射:

import { FaCircleCheck, FaBell, FaClock } from 'react-icons/fa';

// 按实际用到的图标扩展这个对象
const iconMap = {
  FaCircleCheck: FaCircleCheck,
  FaBell: FaBell,
  FaClock: FaClock
};

3. 自定义事件渲染组件

react-big-calendar允许你自定义事件的渲染方式,用eventComponent属性替换默认的事件组件:

const CustomEvent = ({ event }) => {
  // 根据API返回的图标名称获取对应的组件
  const IconComponent = iconMap[event.icon];
  
  return (
    <div className="rbc-event-content">
      {/* 如果存在对应的图标组件就渲染,否则只显示标题 */}
      {IconComponent && <IconComponent style={{ marginRight: '4px', fontSize: '0.9em' }} />}
      {event.title}
    </div>
  );
};

// 在Calendar组件中使用自定义事件组件
<Calendar
  events={yourEventsList}
  eventComponent={CustomEvent}
  // 其他必填配置(比如localizer、views等)
/>

应急方案(无法修改API时)

如果没法调整API返回格式,只能从标题字符串里提取图标信息,这种方式不推荐(容易出错、有XSS风险),但可以临时用:

// 从标题字符串中提取图标名称
const getIconName = (title) => {
  const regex = /<(\w+) \/>/;
  const match = title.match(regex);
  return match ? match[1] : null;
};

// 提取去除图标标签后的纯标题
const getPureTitle = (title) => {
  return title.replace(/<\w+ \/>/, '').trim();
};

const CustomEvent = ({ event }) => {
  const iconName = getIconName(event.title);
  const pureTitle = getPureTitle(event.title);
  const IconComponent = iconMap[iconName];
  
  return (
    <div className="rbc-event-content">
      {IconComponent && <IconComponent style={{ marginRight: '4px' }} />}
      {pureTitle}
    </div>
  );
};

注意事项

  • 不要用dangerouslySetInnerHTML来渲染JSX字符串,这会引入XSS安全风险,而且React官方不推荐这种做法。
  • 尽量保持API返回数据的结构化,分开标题和图标标识,这样代码更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:22:18