fix: 简化 useEffect 逻辑,确保默认审批人正确加载

- 移除嵌套的异步函数,直接在 useEffect 中处理
- 只依赖 location.state?.fromSelection,避免不必要的重新执行
- 优化初始化流程:选择页面返回 > 草稿恢复 > 默认数据加载

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-25 21:37:28 +08:00
parent 0ee7cb6f49
commit fa2d119099
+24 -32
View File
@@ -88,43 +88,43 @@ export default function BusinessTripApply() {
// 统一处理:草稿恢复、默认审批人加载、选择页面返回 // 统一处理:草稿恢复、默认审批人加载、选择页面返回
const initRef = useRef(false) const initRef = useRef(false)
useEffect(() => { const fromSelectionRef = useRef(false)
// 防止重复执行
if (initRef.current) {
// 只有从选择页面返回时才重新执行
if (!location.state?.fromSelection) {
return
}
}
useEffect(() => {
const fromSelection = location.state?.fromSelection const fromSelection = location.state?.fromSelection
console.log('📍 Page init:', { fromSelection, path: location.pathname }) fromSelectionRef.current = !!fromSelection
console.log('📍 Page init:', { fromSelection, initRef: initRef.current })
// 1. 从选择页面返回:恢复所有人员数据 // 1. 从选择页面返回:恢复所有人员数据
if (fromSelection) { if (fromSelection) {
console.log('🔄 Returning from selection page') console.log('🔄 Returning from selection page')
const approversData = sessionStorage.getItem('selectedApprovers') const approversData = sessionStorage.getItem('selectedApprovers')
if (approversData) { if (approversData) {
const approvers = JSON.parse(approversData) as ApproverItem[] setApprovers(JSON.parse(approversData))
setApprovers(approvers) console.log('✅ Restored approvers')
console.log('✅ Restored approvers:', approvers)
} else { } else {
setApprovers([]) setApprovers([])
} }
const ccData = sessionStorage.getItem('selectedCc') const ccData = sessionStorage.getItem('selectedCc')
if (ccData) { if (ccData) {
const cc = JSON.parse(ccData) as ApproverItem[] setCcUsers(JSON.parse(ccData))
setCcUsers(cc) console.log('✅ Restored CC')
console.log('✅ Restored CC:', cc)
} else { } else {
setCcUsers([]) setCcUsers([])
} }
initRef.current = true
return return
} }
// 2. 恢复草稿数据(理由、行程) // 2. 非首次进入且已初始化过:跳过
if (initRef.current) {
console.log('⏭️ Already initialized, skipping')
return
}
initRef.current = true
// 3. 恢复草稿数据(理由、行程)
const draftData = sessionStorage.getItem('businessTripDraft') const draftData = sessionStorage.getItem('businessTripDraft')
if (draftData) { if (draftData) {
console.log('📦 Restoring draft data') console.log('📦 Restoring draft data')
@@ -139,29 +139,21 @@ export default function BusinessTripApply() {
})) }))
setItineraries(restoredItineraries) setItineraries(restoredItineraries)
} }
} catch (error) {
console.error('❌ Failed to restore draft:', error)
}
}
// 3. 加载默认审批人和抄送人(仅在首次且无草稿时)
const loadDefaultApprovers = async () => {
if (initRef.current) return
initRef.current = true
// 如果有草稿数据,不加载默认值
if (draftData) {
console.log('⏭️ Skipping default load (has draft)')
// 恢复草稿关联的人员数据 // 恢复草稿关联的人员数据
const approversData = sessionStorage.getItem('selectedApprovers') const approversData = sessionStorage.getItem('selectedApprovers')
const ccData = sessionStorage.getItem('selectedCc') const ccData = sessionStorage.getItem('selectedCc')
if (approversData) setApprovers(JSON.parse(approversData)) if (approversData) setApprovers(JSON.parse(approversData))
if (ccData) setCcUsers(JSON.parse(ccData)) if (ccData) setCcUsers(JSON.parse(ccData))
} catch (error) {
console.error('❌ Failed to restore draft:', error)
}
return return
} }
// 清除旧数据,加载默认配置 // 4. 首次进入且无草稿:加载默认审批人和抄送人
console.log('🔄 Loading default approvers from backend...') console.log('🔄 Loading default approvers from backend...')
const loadDefaultApprovers = async () => {
// 清除旧数据
sessionStorage.removeItem('selectedApprovers') sessionStorage.removeItem('selectedApprovers')
sessionStorage.removeItem('selectedCc') sessionStorage.removeItem('selectedCc')
@@ -183,7 +175,7 @@ export default function BusinessTripApply() {
} }
loadDefaultApprovers() loadDefaultApprovers()
}, [location.state]) }, [location.state?.fromSelection])
// 计算总时长(累加所有行程的天数) // 计算总时长(累加所有行程的天数)
const totalDuration = useMemo(() => { const totalDuration = useMemo(() => {