动态表格联动需通过data-id等唯一标识建立数据归属关系,变更触发重渲染并保留上下文;过滤、拖拽等操作必须同步更新原始数据而非仅操作DOM,且须处理colspan/rowspan导致的列映射偏移。

动态表格联动不是靠CSS样式“看起来连上了”,而是让不同表格之间建立明确的数据归属和响应关系。核心在于:一个表格的变更必须能触发另一个表格的重渲染或字段更新,且不能丢失原始数据上下文。
用 data-* 属性绑定行级唯一标识
多个动态表格共享同一份原始数据时,每行必须携带不可变标识,否则联动后无法定位到源记录。
- 不要用
rowIndex或cells[0].textContent当主键——内容可能重复或为空 - 在生成
<tr> 时写入 <code>data-id="123",值来自后端返回的唯一 ID 或本地生成的 UUID - 联动操作(如点击“复制到待办”)时,通过
event.target.closest("tr").dataset.id拿到目标 ID,再查原始数据数组 - 如果原始数据是对象数组,直接用
data.find(item => item.id === id)定位,避免索引偏移风险 - 监听
#model的change事件,调用renderTable(filterByModel(partsData, selectedModel)) -
renderTable()函数内部用document.createElement("tr")+appendChild()构建新行,而不是innerHTML +=—— 后者会销毁已绑定的事件监听器 - 若需保留某行输入状态(如用户已填了数量),应在过滤前读取并缓存该行的
data-id对应字段值,渲染后再回填
下拉选择触发表格过滤而非 DOM 移动
用户选中某个型号后,“新品零件表”只显示兼容项,这不是隐藏某些 <tr>,而是重新生成整张表的 <code><tbody>。<ul>
<li>把原始零件数据存为全局变量(如 <code>window.partsData),不依赖当前表格 DOM 结构
跨表格拖拽时同步更新原始数据索引
Trello 式看板中把任务从“进行中”拖到“已完成”,不只是移动 DOM,还要更新原始数据里对应项的 status 字段。
立即学习“前端免费学习笔记(深入)”;
- 拖拽结束事件(
drop)中,拿到目标列容器的dataset.status值(如"done") - 根据被拖元素的
dataset.id查原始数组,执行item.status = "done" - 随后调用
rebuildAllTables(),而不是只刷新当前列——否则“新品零件表”和“旧件零件表”会不同步 - 注意:不要在拖拽过程中实时修改原始数组,应在
dragend后统一提交,避免中间态干扰其他逻辑
最容易被忽略的是 colspan 和 rowspan 对列映射的破坏——哪怕只是表头有一处合并,后续所有按列索引取值的联动都会错位。必须在初始化阶段就构建列偏移映射表,而不是假设 th[2] 就是第三列。



















