Bug 描述
在 Grid 视图中,点击 link 字段进入编辑模式后,如果不移动鼠标直接点击关联记录的 chip(标签),会打开"选择关联记录"面板,而不是展开关联记录详情。需要先移动一下鼠标(哪怕 1px),cursor 变成小手后再点击才能正确打开。
复现步骤
打开包含 link 字段的 Grid 视图,link 字段中已有关联记录
点击某个 link 单元格,使其进入编辑模式(cell 放大,chip 可见)
不移动鼠标 ,直接点击某个关联记录 chip
期望行为 :打开该关联记录的详情(expand record)
实际行为 :打开"选择关联记录"面板,和点击空白区域效果一样
现在移动鼠标(哪怕 1px),cursor 变成小手 pointer
再点击 chip → 这次正确打开了关联记录详情
视频对比
Teable (bug — 必须先动鼠标才能点击 chip):
20260510_171431.mp4
NocoDB (正确 — 进入编辑模式后可直接点击 chip):
20260510_171147.mp4
原因分析
问题在 InteractionLayer.tsx 的 onClick handler 中,调用 cellRenderer.onClick 前检查了 hoverCellPosition:
if ( onCellClick && hoverCellPosition ) {
onCellClick ( cell , { ..., hoverCellPosition , ... } , callback ) ;
}
hoverCellPosition 只在 onMouseMove 中通过 useRafState 更新。用户点击时如果没有移动鼠标,hoverCellPosition 仍然是上一次 render 的旧值(null),导致整个 onCellClick 分支被跳过。
useRafState(来自 react-use)通过 requestAnimationFrame 延迟 setState,即使程序化触发 mousemove 事件也无法在同一个事件循环内更新到最新值。
建议修复
在 onClick 中,当 hoverCellPosition 为 null 时重新计算:
case RegionType . ActiveCell : {
const cell = getCellContent ( [ columnIndex , rowIndex ] ) ;
const cellRenderer = getCellRenderer ( cell . type ) ;
const onCellClick = cellRenderer . onClick ;
const isActive = /* ... */ ;
// 当 hoverCellPosition 为 null 时用当前 mouseState 重新计算
const effectiveHoverCellPosition = hoverCellPosition ?? getHoverCellPosition ( getMouseState ( ) ) ;
if ( onCellClick && effectiveHoverCellPosition ) {
onCellClick ( cell , { ..., hoverCellPosition : effectiveHoverCellPosition , ... } , callback ) ;
}
}
环境
Teable 版本:latest Docker (ghcr.io/teableio/teable:latest)
浏览器:Chrome 136
系统:macOS
Bug 描述
在 Grid 视图中,点击 link 字段进入编辑模式后,如果不移动鼠标直接点击关联记录的 chip(标签),会打开"选择关联记录"面板,而不是展开关联记录详情。需要先移动一下鼠标(哪怕 1px),cursor 变成小手后再点击才能正确打开。
复现步骤
期望行为:打开该关联记录的详情(expand record)
实际行为:打开"选择关联记录"面板,和点击空白区域效果一样
视频对比
Teable(bug — 必须先动鼠标才能点击 chip):
20260510_171431.mp4
NocoDB(正确 — 进入编辑模式后可直接点击 chip):
20260510_171147.mp4
原因分析
问题在
InteractionLayer.tsx的onClickhandler 中,调用cellRenderer.onClick前检查了hoverCellPosition:hoverCellPosition只在onMouseMove中通过useRafState更新。用户点击时如果没有移动鼠标,hoverCellPosition仍然是上一次 render 的旧值(null),导致整个onCellClick分支被跳过。useRafState(来自react-use)通过requestAnimationFrame延迟setState,即使程序化触发mousemove事件也无法在同一个事件循环内更新到最新值。建议修复
在
onClick中,当hoverCellPosition为null时重新计算:环境
ghcr.io/teableio/teable:latest)