From ee931e49b718d347f8768c40a500e6df134f5dbb Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Feb 2026 18:57:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E4=BA=BA=E5=90=8E=E6=8A=84=E9=80=81=E4=BA=BA?= =?UTF-8?q?=E6=B6=88=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 useRef 防止默认审批人/抄送人数据重复加载 - 确保从选择页面返回时,另一类型的数据不受影响 Co-Authored-By: Claude Opus 4.6 --- frontend/src/pages/business-trip/apply.tsx | 7 ++++++- frontend/src/pages/business-trip/select-approver.tsx | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/business-trip/apply.tsx b/frontend/src/pages/business-trip/apply.tsx index 3426589..b85be1b 100644 --- a/frontend/src/pages/business-trip/apply.tsx +++ b/frontend/src/pages/business-trip/apply.tsx @@ -87,7 +87,11 @@ export default function BusinessTripApply() { const hasRestoredRef = useRef(false) // 加载默认审批人和抄送人(仅在首次加载且没有草稿数据时) + const defaultLoadedRef = useRef(false) useEffect(() => { + // 防止重复加载 + if (defaultLoadedRef.current) return + const loadDefaultApprovers = async () => { // 如果已经有存储的草稿数据,不加载默认值 if (sessionStorage.getItem('businessTripDraft')) { @@ -112,13 +116,14 @@ export default function BusinessTripApply() { setCcUsers(defaultData.cc_users) sessionStorage.setItem('selectedCc', JSON.stringify(defaultData.cc_users)) } + defaultLoadedRef.current = true } catch (error) { console.error('Failed to load default approvers:', error) } } loadDefaultApprovers() - }, []) + }, [location.state?.fromSelection]) // 处理从选择页面返回的数据和草稿恢复 useEffect(() => { diff --git a/frontend/src/pages/business-trip/select-approver.tsx b/frontend/src/pages/business-trip/select-approver.tsx index 869e8d1..336891d 100644 --- a/frontend/src/pages/business-trip/select-approver.tsx +++ b/frontend/src/pages/business-trip/select-approver.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useState, useEffect, useRef } from 'react' import { useNavigate, useLocation } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { NavBar, SearchBar, Button, Toast, Empty } from 'antd-mobile' @@ -39,10 +39,13 @@ export default function SelectUserPage() { const [loading, setLoading] = useState(false) const [hasMore, setHasMore] = useState(true) const [page, setPage] = useState(1) - const [defaultLoaded, setDefaultLoaded] = useState(false) + const initialLoadedRef = useRef(false) // 获取初始选中的用户(从 sessionStorage 或后端默认配置) const loadInitialSelected = async () => { + // 防止重复加载 + if (initialLoadedRef.current) return + const type = location.state?.type || 'approver' const storageKey = type === 'approver' ? 'selectedApprovers' : 'selectedCc' @@ -53,6 +56,7 @@ export default function SelectUserPage() { const parsed = JSON.parse(storedData) if (parsed.length > 0) { setSelectedUsers(parsed) + initialLoadedRef.current = true return } } catch (e) { @@ -72,6 +76,7 @@ export default function SelectUserPage() { // 获取失败时设置为空数组 setSelectedUsers([]) } + initialLoadedRef.current = true } // 加载用户列表