From fa2d119099823ab0d1a6d28a7edf8e8731cc9bd8 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Feb 2026 21:37:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=AE=80=E5=8C=96=20useEffect=20?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E4=BA=BA=E6=AD=A3=E7=A1=AE=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除嵌套的异步函数,直接在 useEffect 中处理 - 只依赖 location.state?.fromSelection,避免不必要的重新执行 - 优化初始化流程:选择页面返回 > 草稿恢复 > 默认数据加载 Co-Authored-By: Claude Opus 4.6 --- frontend/src/pages/business-trip/apply.tsx | 60 ++++++++++------------ 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/frontend/src/pages/business-trip/apply.tsx b/frontend/src/pages/business-trip/apply.tsx index da7a3ce..dc40556 100644 --- a/frontend/src/pages/business-trip/apply.tsx +++ b/frontend/src/pages/business-trip/apply.tsx @@ -88,43 +88,43 @@ export default function BusinessTripApply() { // 统一处理:草稿恢复、默认审批人加载、选择页面返回 const initRef = useRef(false) - useEffect(() => { - // 防止重复执行 - if (initRef.current) { - // 只有从选择页面返回时才重新执行 - if (!location.state?.fromSelection) { - return - } - } + const fromSelectionRef = useRef(false) + useEffect(() => { 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. 从选择页面返回:恢复所有人员数据 if (fromSelection) { console.log('🔄 Returning from selection page') const approversData = sessionStorage.getItem('selectedApprovers') if (approversData) { - const approvers = JSON.parse(approversData) as ApproverItem[] - setApprovers(approvers) - console.log('✅ Restored approvers:', approvers) + setApprovers(JSON.parse(approversData)) + console.log('✅ Restored approvers') } else { setApprovers([]) } const ccData = sessionStorage.getItem('selectedCc') if (ccData) { - const cc = JSON.parse(ccData) as ApproverItem[] - setCcUsers(cc) - console.log('✅ Restored CC:', cc) + setCcUsers(JSON.parse(ccData)) + console.log('✅ Restored CC') } else { setCcUsers([]) } - initRef.current = true return } - // 2. 恢复草稿数据(理由、行程) + // 2. 非首次进入且已初始化过:跳过 + if (initRef.current) { + console.log('⏭️ Already initialized, skipping') + return + } + initRef.current = true + + // 3. 恢复草稿数据(理由、行程) const draftData = sessionStorage.getItem('businessTripDraft') if (draftData) { console.log('📦 Restoring draft data') @@ -139,29 +139,21 @@ export default function BusinessTripApply() { })) 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 ccData = sessionStorage.getItem('selectedCc') if (approversData) setApprovers(JSON.parse(approversData)) if (ccData) setCcUsers(JSON.parse(ccData)) - return + } catch (error) { + console.error('❌ Failed to restore draft:', error) } + return + } - // 清除旧数据,加载默认配置 - console.log('🔄 Loading default approvers from backend...') + // 4. 首次进入且无草稿:加载默认审批人和抄送人 + console.log('🔄 Loading default approvers from backend...') + const loadDefaultApprovers = async () => { + // 清除旧数据 sessionStorage.removeItem('selectedApprovers') sessionStorage.removeItem('selectedCc') @@ -183,7 +175,7 @@ export default function BusinessTripApply() { } loadDefaultApprovers() - }, [location.state]) + }, [location.state?.fromSelection]) // 计算总时长(累加所有行程的天数) const totalDuration = useMemo(() => {