# 实现方案 — 字段聚焦高亮、删除按钮显隐控制与 .map Bug 修复(2026-04-17-11-14-28)
## 一、修改文件清单
1. `src/pages/TemplateManage.tsx` — 调整 `insertSmartField` HTML 结构;给编辑器增加 `template-editor-mode` class
2. `src/utils/defaultContent.ts` — 同步调整 `smartField()` HTML 结构
3. `src/index.css` — 聚焦高亮样式 + 删除按钮绝对定位 + 显隐控制
4. `src/pages/ReportEditor.tsx` — 修复 `multi_select` 的 `.map` 类型安全
## 二、详细改动
### 2.1 `src/pages/TemplateManage.tsx`
#### A. `insertSmartField` HTML 结构调整
将 `delete-btn` 放到 `.field-value` **之后**,并给 `.smart-field-wrapper` 增加 `position:relative`:
```html
×
```
#### B. 编辑器容器增加专属 class
在渲染编辑器的 `
` 上增加 `template-editor-mode`:
```tsx
```
### 2.2 `src/utils/defaultContent.ts`
同步修改 `smartField(key)` 的 HTML 结构,与 `insertSmartField` 完全一致。
### 2.3 `src/index.css`
#### A. field-value 聚焦高亮
```css
.smart-field-wrapper .field-value:focus {
background-color: #e2e8f0;
border-color: #94a3b8;
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.25);
transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}
```
#### B. 删除按钮样式(默认隐藏)
```css
.smart-field-wrapper .delete-btn {
position: absolute;
top: -8px;
right: -8px;
width: 16px;
height: 16px;
background: #ef4444;
color: white;
border-radius: 50%;
font-size: 10px;
line-height: 16px;
text-align: center;
cursor: pointer;
user-select: none;
display: none;
z-index: 10;
}
.smart-field-wrapper .delete-btn:hover {
background: #dc2626;
}
```
#### C. 显隐控制(仅在 TemplateManage 显示)
```css
.template-editor-mode .smart-field-wrapper:hover .delete-btn,
.template-editor-mode .smart-field-wrapper:focus-within .delete-btn {
display: block;
}
```
#### D. 打印隐藏
保留已有的 `.print-content .smart-field-wrapper .delete-btn { display: none !important; }`。
### 2.4 `src/pages/ReportEditor.tsx`
修复 `multi_select` 渲染处的 `.map` 调用:
```tsx
if (field.type === 'multi_select') {
const isOpen = openDropdown === field.key;
const opts = field.options || multiSelectOptions[field.key] || [];
const rawValue = (reportData as any)[field.key];
const tags = Array.isArray(rawValue) ? rawValue : (rawValue ? [String(rawValue)] : []);
return (
...
{tags.map((tag: string) => (
...
))}
...
);
}
```
## 三、风险与回滚
- **风险**:修改 `smartField` HTML 结构和 CSS 后,旧报告中已存在的智能字段没有删除按钮。这是预期行为(旧数据不回溯)。
- **风险**:`delete-btn` 的 `display: none` 默认隐藏 + `.template-editor-mode` 控制显示,ReportEditor 中由于容器没有 `template-editor-mode` class,删除按钮不会显示。
- **回滚**:如出现问题,可回退上述 4 个文件的修改。