最近有一个需求,想要实现在protable的查询栏上,当用户选择查询条件时,立刻进行筛选,而不用点击查询,研究了一下发现要使用受控的params
const queryRef = useRef()
const [userQuery, setUserQuery] = useState({})
<ProTable formRef={queryRef} params={userQuery} />
当你控制了params后, 默认渲染出的查询表单的查询和重置按钮就会失效,需要自己去实现
如果我们要指定某个字段进行自动搜索,那么就需要在column里配置
下面是一个选择框的例子,我们配置这个选择框选择任意值以后,就修改userQuery这个参数, 并且触发reload重新刷新
{
title: <FormattedMessage id="DMT92" />,
dataIndex: 'Location',
width: "10%",
valueType: 'select',
fieldProps: {
showSearch: true,
onSelect: (v)=> {
let nQ = userQuery
nQ["Location"] = v
setUserQuery(nQ)
reload()
},
onClear: ()=> {
let nQ = userQuery
nQ["Location"] = ""
setUserQuery(nQ)
reload()
}
},
request: ()=> {
return options.options("SMaxLocation")
}
},
如果我们要使用输入框自动触发搜索,那么我们可能需要加上一个节流函数, 防止性能问题
function debounce(func, wait) {
let timeoutId;
return function (...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
func.apply(this, args);
}, wait);
};
}
{
title: <FormattedMessage id="WST18" />,
dataIndex: 'Model',
width: "15%",
ellipsis: true,
fieldProps: {
onChange: debounce((event) => {
let nQ = userQuery
nQ["Model"] = event.target.value
setUserQuery(nQ)
reload()
}, 500)
}
},
如果我们需要重置查询表单, 那么可以使用
queryRef?.current?.resetFields()
发表回复