深入剖析 ProTable 模糊搜索代码及其改写
接下来,我们将深入解析一段利用 ProTable 和 AutoComplete 组件实现模糊搜索的代码,帮助大家更好地理解其中的奥秘。
一、代码解析
这段代码主要基于 React 框架进行编写,旨在实现一个带有模糊搜索功能的表格页面。
首先映入眼帘的是一系列的导入语句:
import React, { useState } from 'react';
import ProTable from '@ant-design/pro-table';
import { AutoComplete } from 'antd';
import debounce from 'lodash/debounce';
这里引入了 React 核心库以及用于状态管理的 useState 钩子函数,ProTable 是一款功能强大、高度可定制的表格组件,能满足复杂的数据展示需求;AutoComplete 组件来自 antd 库,可为用户输入提供自动完成的提示功能,大大提高输入效率;而 debounce 函数则是从 lodash 库引入,用于对频繁触发的函数进行防抖处理,避免因用户快速输入导致过多不必要的请求。
接着定义了一个模拟获取场景名称列表的函数 getSceneNameList:
const getSceneNameList = async ({ sceneName }) => {
return [
{ datasetName: `${sceneName} 结果 1` },
{ datasetName: `${sceneName} 结果 2` },
];
};
在实际应用中,此函数应替换为真实的 API 请求,向服务器端获取与用户输入场景名称相关的数据。当前只是简单模拟返回两个包含输入关键词的结果,用于演示后续流程。
随后是组件定义部分:
const FuzzySearchTable = () => {
const [searchValue, setSearchValue] = useState('');
const [sceneOptions, setSceneOptions] = useState([
{ label: '常用场景 1', value: '常用场景 1' },
{ label: '常用场景 2', value: '常用场景 2' },
]);
在 FuzzySearchTable 组件内部,利用 useState 初始化了两个状态变量。searchValue 用于存储用户在搜索框(由 AutoComplete 组件呈现)内输入的文本,以便后续根据此值进行搜索操作;sceneOptions 则用于保存 AutoComplete 组件下拉菜单中的可选项目,初始化为两个简单的常用场景,避免用户首次输入时下拉菜单为空,提供更好的初始体验。
然后是防抖处理后的搜索函数:
const debouncedSearch = debounce(async (text) => {
try {
let result = (await getSceneNameList({ sceneName: text })) || [];
setSceneOptions(
result.map((v) => {
return { label: v.datasetName, value: v.datasetName };
}),
);
} catch (error) {
console.error('搜索出错:', error);
alert('搜索出现问题,请稍后重试');
}
}, 300);
debouncedSearch 函数运用了 debounce 进行防抖,用户输入文本触发搜索时,延迟 300 毫秒执行实际搜索逻辑。在函数内部,先尝试调用 getSceneNameList 获取数据,若成功则根据返回结果更新 sceneOptions,将数据格式化为 AutoComplete 所需的 label 和 value 形式;若出现错误,在控制台记录错误信息,并向用户弹出提示框告知搜索出现问题。
最后是组件的返回结构:
return (
<ProTable
columns={[
{
title: 'ID',
dataIndex: 'id',
width: 100,
},
{
title: '名称',
dataIndex: 'datasetName',
width: 150,
renderFormItem: (_, { fieldProps }) => {
return (
<AutoComplete
placeholder={'名称'}
onChange={(e) => setSearchValue(e.target.value)}
{...fieldProps}
options={sceneOptions}
onSearch={debouncedSearch}
/>
);
},
},
]}
request={async (params) => {
const { data } = await Promise.resolve({
data: [
{ id: 1, datasetName: '示例数据 1' },
{ id: 2, datasetName: '示例数据 2' },
],
success: true,
});
return {
data: data,
success: true,
}
};
}
/>
);
};
export default FuzzySearchTable;
这里 ProTable 组件是核心展示区域,columns 定义了表格的列结构,包含“ID”列和“名称”列。重点关注“名称”列,通过 renderFormItem 方法渲染了 AutoComplete 组件,为用户在编辑该列时提供自动完成功能。它绑定了 placeholder 作为占位提示,onChange 实时更新 searchValue,options 关联了动态更新的 sceneOptions,onSearch 触发防抖搜索函数。同时,ProTable 的 request 函数模拟了向后端请求数据的过程,目前只是简单返回固定的示例数据,实际项目中需依据真实接口改造。