diff --git a/frontend/src/pages/usr/UserList/useUserList.ts b/frontend/src/pages/usr/UserList/useUserList.ts index 4a67fa8..f6d0e2e 100644 --- a/frontend/src/pages/usr/UserList/useUserList.ts +++ b/frontend/src/pages/usr/UserList/useUserList.ts @@ -51,6 +51,9 @@ export function useUserList(): UseUserListReturn { const messageRef = useRef(message); messageRef.current = message; + // 卸载守卫:避免异步取数 resolve/reject 在组件卸载后 setState(防内存泄漏 / 测试环境拆除后报错) + const mountedRef = useRef(true); + /** 以给定 query 取数;同步 total/pageNum/pageSize 回显(BR15);错误码分流(spec § 4) */ const runFetch = useCallback(async (q: UserListQuery) => { setQuery(q); @@ -59,6 +62,7 @@ export function useUserList(): UseUserListReturn { setError(null); try { const pageData = await listUsers(q); + if (!mountedRef.current) return; setList(pageData.records); setTotal(pageData.total); // 信任后端回显(越界回退最后一页等),同步分页当前页/页大小(BR15) @@ -69,6 +73,7 @@ export function useUserList(): UseUserListReturn { }); setLoading(false); } catch (err) { + if (!mountedRef.current) return; const apiErr = err instanceof ApiError ? err : new ApiError(-1, TEXT_MSG_NETWORK); setLoading(false); if (apiErr.code === ERR_PAGE_INVALID) { @@ -92,7 +97,11 @@ export function useUserList(): UseUserListReturn { // 挂载即以默认条件取数(initialLoading,BR2) useEffect(() => { + mountedRef.current = true; void runFetch({ ...DEFAULT_QUERY }); + return () => { + mountedRef.current = false; + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -140,11 +149,11 @@ export function useUserList(): UseUserListReturn { const pageData = await listUsers({ ...cur, pageNum: 1, pageSize: fetchSize }); const csv = buildUserCsv(pageData.records); downloadCsv(EXPORT_FILENAME, csv); - messageRef.current.success(TEXT_EXPORT_SUCCESS); + if (mountedRef.current) messageRef.current.success(TEXT_EXPORT_SUCCESS); } catch { - messageRef.current.error(TEXT_EXPORT_FAIL); + if (mountedRef.current) messageRef.current.error(TEXT_EXPORT_FAIL); } finally { - setExporting(false); + if (mountedRef.current) setExporting(false); } }, [total]); diff --git a/frontend/tests/unit/UserTable.test.tsx b/frontend/tests/unit/UserTable.test.tsx index 31d4d85..34b153a 100644 --- a/frontend/tests/unit/UserTable.test.tsx +++ b/frontend/tests/unit/UserTable.test.tsx @@ -1,6 +1,6 @@ // REQ-USR-003: UserTable 表格单测(BR1/BR6/BR11/BR12/BR14/D8) import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { screen, within } from '@testing-library/react'; +import { screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { renderShell } from './renderShell'; import UserTable from '../../src/pages/usr/UserList/UserTable';