fix: [FL-186][菜单管理页面输入关键字时不要触发查询动作]

将关键字输入与实际查询参数分离,用户在输入框中输入时不会立即触发API请求。
只有在点击「搜索」按钮或按下Enter键时才执行查询。

改动点:
- 新增activeKeyword和activeStatusFilter状态用于存储实际查询参数
- 修改loadMenus依赖为activeKeyword和activeStatusFilter
- 新增handleSearch函数,在点击搜索时更新查询参数
- 为关键字输入框添加onPressEnter支持

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
chengkai3
2026-06-18 08:41:04 +08:00
parent 3cc35c0336
commit af14490042
+14 -6
View File
@@ -95,6 +95,8 @@ export default function AdminMenusPage() {
const [editingMenuId, setEditingMenuId] = useState<string | null>(null);
const [keyword, setKeyword] = useState("");
const [statusFilter, setStatusFilter] = useState<FilterStatus>("all");
const [activeKeyword, setActiveKeyword] = useState("");
const [activeStatusFilter, setActiveStatusFilter] = useState<FilterStatus>("all");
const [tableScrollY, setTableScrollY] = useState(MENU_TABLE_MIN_SCROLL_Y);
const [form] = Form.useForm<MenuFormValues>();
const tableScrollAnchorRef = useRef<HTMLDivElement | null>(null);
@@ -143,11 +145,11 @@ export default function AdminMenusPage() {
setError("");
const params = new URLSearchParams();
if (keyword.trim()) {
params.append("keyword", keyword.trim());
if (activeKeyword.trim()) {
params.append("keyword", activeKeyword.trim());
}
if (statusFilter !== "all") {
params.append("status", statusFilter);
if (activeStatusFilter !== "all") {
params.append("status", activeStatusFilter);
}
const url = `/api/v1/admin/menus${params.toString() ? `?${params.toString()}` : ""}`;
@@ -161,7 +163,7 @@ export default function AdminMenusPage() {
const payload = (await response.json()) as MenuListResponse;
setMenus(payload.items.map(normalizeMenuItemPath));
setLoading(false);
}, [canRead, fetchWithAuth, keyword, statusFilter]);
}, [canRead, fetchWithAuth, activeKeyword, activeStatusFilter]);
useEffect(() => {
if (!user || !canRead) {
@@ -182,6 +184,11 @@ export default function AdminMenusPage() {
}, [canRead, loadMenus, user]),
);
const handleSearch = useCallback(() => {
setActiveKeyword(keyword);
setActiveStatusFilter(statusFilter);
}, [keyword, statusFilter]);
const closeDialog = useCallback(() => {
setDialogOpen(false);
setEditingMenuId(null);
@@ -499,6 +506,7 @@ export default function AdminMenusPage() {
allowClear
value={keyword}
onChange={(event) => setKeyword(event.currentTarget.value)}
onPressEnter={handleSearch}
placeholder="按编码/名称/路径筛选"
/>
</Form.Item>
@@ -518,7 +526,7 @@ export default function AdminMenusPage() {
<Form.Item>
<Button
type="primary"
onClick={() => void loadMenus()}
onClick={handleSearch}
>
</Button>