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

React中基于ID填充静态课程表单元格的最优方案咨询

最优实现方案

首先,为了高效匹配lesson_id和单元格ID,建议先把timetableData转换成以lesson_id为键的对象,这样能以O(1)的时间复杂度查找对应数据,比循环遍历数组效率高很多,数据量大时优势更明显。

下面分两种场景给出具体实现方式:

1. 原生JS直接操作DOM(无框架场景)

如果是用纯JavaScript开发,可在数据加载完成后,通过映射表快速定位单元格并填充内容:

// 将数组转换为键值对映射,方便快速查找
const timetableMap = timetableData.reduce((map, item) => {
  map[item.lesson_id] = item;
  return map;
}, {});

// 遍历映射表,填充对应单元格
Object.entries(timetableMap).forEach(([id, lesson]) => {
  const cell = document.getElementById(id);
  if (cell) {
    cell.innerHTML = `
      <div>${lesson.subject}</div>
      <div>${lesson.teacher}</div>
    `;
    // 无数据的单元格可直接添加输入框
    // 例:else { cell.innerHTML = '<input type="text" placeholder="添加课程" />'; }
  }
});

2. React场景下的实现(适配你的JSX代码)

React中不推荐直接操作DOM,建议通过条件渲染实现。先将数据转成映射表,再在渲染单元格时匹配数据:

第一步:缓存映射表

在组件中用useMemo缓存映射表,避免每次渲染重复生成:

const timetableMap = useMemo(() => {
  return timetableData.reduce((map, item) => {
    map[item.lesson_id] = item;
    return map;
  }, {});
}, [timetableData]);

第二步:封装单元格组件(简化代码)

把单元格逻辑封装成独立组件,减少重复代码:

const TimetableCell = ({ cellId, timetableMap }) => {
  const lesson = timetableMap[cellId];
  return (
    <td className={styles.tg0lax} id={cellId}>
      {lesson ? (
        <>
          <div>{lesson.subject}</div>
          <div>{lesson.teacher}</div>
        </>
      ) : (
        <input type="text" placeholder="添加课程" />
      )}
    </td>
  );
};

第三步:使用组件渲染表格

用封装好的组件替换原有的单元格代码,让结构更简洁:

<table className={styles.tg}>
 <thead>
  <tr>
   <th className={styles.tg0lax}>x</th>
   <th className={styles.tg0lax}>Monday</th>
   <th className={styles.tg0lax}>Tuesday</th>
   <th className={styles.tg0lax}>Wednesday</th>
   <th className={styles.tg0lax}>Thursday</th>
   <th className={styles.tg0lax}>Friday</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td className={styles.tg0lax}>1</td>
   <TimetableCell cellId={101} timetableMap={timetableMap} />
   <TimetableCell cellId={201} timetableMap={timetableMap} />
   <TimetableCell cellId={301} timetableMap={timetableMap} />
   <TimetableCell cellId={401} timetableMap={timetableMap} />
   <TimetableCell cellId={501} timetableMap={timetableMap} />
  </tr>
  {/* 后续行按同样方式替换即可 */}
 </tbody>
</table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:03:39