fix: 简化 useEffect 逻辑,确保默认审批人正确加载
- 移除嵌套的异步函数,直接在 useEffect 中处理 - 只依赖 location.state?.fromSelection,避免不必要的重新执行 - 优化初始化流程:选择页面返回 > 草稿恢复 > 默认数据加载 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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))
|
||||||
return
|
} catch (error) {
|
||||||
|
console.error('❌ Failed to restore draft:', error)
|
||||||
}
|
}
|
||||||
|
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(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user