在使用图像处理页面时,切换到1x1布局后,viewer总是显示第一个图像,而非选中体位对应图像。同时,发现切换体位时会导致无限渲染循环错误。
BodyPositionList 点击 → selectedBodyPosition 更新
↓
ViewerContainer useEffect触发 → renderGrid() → dispatch → 重新渲染
↓
无限循环异常
↓
布局切换 → 固定选择第一个图像
文件: src/pages/view/components/ViewerContainer.tsx
// 移除以下useEffect,因为它会导致renderGrid在每次渲染时被调用
// 删除此useEffect以避免循环
变更点:
useEffect(() => { renderGrid(); }, [selectedBodyPosition, gridLayout])
文件: src/pages/view/components/ViewerContainer.tsx
在1x1 case中添加状态检查逻辑:
case '1x1': {
// 根据 selectedBodyPosition 找到对应URL
let urlToSelect = allViewerUrls[0]; // fallback
if (selectedBodyPosition?.sop_instance_uid) {
const correspondingUrl = getDcmImageUrl(selectedBodyPosition.sop_instance_uid);
const urlIndex = allViewerUrls.indexOf(correspondingUrl);
if (urlIndex !== -1) {
urlToSelect = allViewerUrls[urlIndex];
}
}
// 检查当前选中状态,避免重复dispatch导致的无限循环
const currentSelected = selectedViewerUrls[0];
if (currentSelected !== urlToSelect) {
if (currentSelected) {
dispatch(toggleViewerSelection(currentSelected)); // 取消选中当前
}
dispatch(toggleViewerSelection(urlToSelect)); // 选中新的
}
// 修改renderViewers调用,根据selectedBodyPosition确定显示的图像索引
let viewerIndex = 0;
if (selectedBodyPosition?.sop_instance_uid) {
const correspondingUrl = getDcmImageUrl(selectedBodyPosition.sop_instance_uid);
const index = imageUrls.indexOf(correspondingUrl);
if (index !== -1) {
viewerIndex = index;
}
}
return (
<div className="h-full w-full" style={{ display: 'grid', gridTemplateColumns: '1fr' }}>
{renderViewers(viewerIndex, viewerIndex + 1)}
</div>
);
}
变更点:
getDcmImageUrl
函数用于URL匹配sop_instance_uid
→ getDcmImageUrl()
→ 生成唯一URLallViewerUrls
/imageUrls
数组查找 → 找到索引 → 选择/display对应viewer/图像点击体位 → selectedBodyPosition change → ViewerContainer 检测到变化
↓
renderGrid re-render → 重新计算选择和显示逻辑
↓
1x1布局 → 选择正确viewer + 显示对应图像
[ViewerContainer]
- viewer容器渲染日志通过两个关键修复解决了ViewerContainer组件的问题:
修复确保了体位选择时应用的稳定性和正确显示,为用户提供可靠的图像查看体验。若需要进一步优化为仅显示选中图像,可考虑修改ImageControl组件。