collect-system/apps/web/src/app/admin/code-manage/components/CodeManageSearchBase.tsx

68 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Button, Form, Input } from 'antd';
import { useCodeManageContext } from '../CodeManageContext';
import { ChangeEvent, useEffect, useRef } from 'react';
import { useSearchParams } from "react-router-dom";
export default function CodeManageSearchBase({ keyword }: { keyword?: string }) {
const { setCurrentPage, searchRefetch, setSearchKeyword, searchKeyword } = useCodeManageContext();
const debounceTimer = useRef<NodeJS.Timeout | null>(null);
const formRef = Form.useForm()[0]; // 获取表单实例
const [searchParams, setSearchParams] = useSearchParams();
// 当 keyword 属性变化时更新表单值
useEffect(() => {
if (keyword) {
formRef.setFieldsValue({ search: keyword });
}
}, [keyword, formRef]);
// 监听 searchKeyword 变化,如果 URL 参数中有 keyword 且 searchKeyword 发生变化,则清空 URL 参数
useEffect(() => {
const urlKeyword = searchParams.get('keyword');
if (urlKeyword && searchKeyword !== urlKeyword) {
// 创建一个新的 URLSearchParams 对象,不包含 keyword 参数
const newParams = new URLSearchParams(searchParams);
newParams.delete('keyword');
setSearchParams(newParams);
}
}, [searchKeyword, searchParams, setSearchParams]);
const onSearch = (value: string) => {
console.log(value);
setSearchKeyword(value);
setCurrentPage(1)
searchRefetch()
};
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
// 设置表单值
setSearchKeyword(e.target.value);
// 设置页码为1确保从第一页开始显示搜索结果
setCurrentPage(1);
// 使用防抖处理,避免频繁发送请求
if (debounceTimer.current) {
clearTimeout(debounceTimer.current);
}
debounceTimer.current = setTimeout(() => {
// 触发查询
searchRefetch();
}, 300); // 300毫秒的防抖延迟
};
return <>
<div className="py-4 mt-2 w-2/3 mx-auto">
<Form form={formRef}>
<Form.Item name="search" label="关键字搜索">
<Input.Search
placeholder="输入分享码、文件名或用户IP"
enterButton
value={searchKeyword}
allowClear
onSearch={onSearch}
onChange={onChange}
/>
</Form.Item>
</Form>
</div>
</>
}