# 胶片切换图像残留问题深度分析
## 问题现象
切换胶片后,仍然会有图像残留在新胶片的viewport中。
## 根本原因分析
### 1. React组件复用问题
```typescript
// Film.tsx 中的问题代码
const generateCell = (imageId, indexOfCell) => {
return ();
};
```
**问题**:没有为ViewportContainer提供`key`属性,导致React在切换胶片时复用组件实例,只更新props。
### 2. 渲染引擎状态残留
虽然按胶片ID创建独立的渲染引擎,但切换回之前访问过的胶片时,该渲染引擎可能仍保留之前的viewport状态。
### 3. 组件卸载时序问题
当切换胶片时,旧的DcmCell组件可能没有在正确的时机卸载和清理viewport。
## 解决方案
### 1. 为ViewportContainer添加唯一key
```typescript
// Film.tsx 修复
const generateCell = (imageId, indexOfCell) => {
const uniqueKey = `${currentFilm.id}-${indexOfCell}`;
return (
);
};
```
### 2. 改进渲染引擎清理策略
```typescript
// 选择一:胶片切换时强制清理所有viewport
// 选择二:改进viewport的清理逻辑,确保完全清理
```
### 3. 添加胶片切换时的强制重置
在切换胶片时,主动清理当前显示的所有viewport,确保状态重置。
## 推荐修复步骤
1. 首先修复Film.tsx中的key问题
2. 改进DcmCell.tsx的清理逻辑
3. 考虑在printSlice中添加胶片切换时的清理action