我正在try 阻止重新呈现我的子组件<FyTable />
我有名为<TableCustomer />
的父组件
这是父组件,看起来像
import {
columnDef_FilterCustomer,
columnType_FilterCustomer,
} from "./ColumnDef";
import { useDebounce } from "@uidotdev/usehooks";
const TableCustomer = (props) => {
const { resetRowSelection = false } = props;
const [filterData, setFilterData] = useState([]); //textfield filter values
const debounceFilter = useDebounce(filterData, 500); //debounce, to avoid calling useQuery for every keypress
const [tbData, setTbData] = useState({}); //useQuery result will be set
const handleSelectedRow = useCallback((tbCustomerSeletedRow) => {
console.log(tbCustomerSeletedRow) //print selected row from child component
}, [debounceFilter,columnDef_FilterCustomer,
tbData,columnType_FilterCustomer,resetRowSelection]);
const handleFilter = (event) => {
// logic...
setFilterData(arrayValue)
}
// calling useQuery debounceFilter as a parameter
const {
isSuccess: isSuccess_get_filterCustomer,
data: data_get_filterCustomer,
isError: isError_get_filterCustomer,
error: error_get_filterCustomer,
isPending: isPending_get_filterCustomer,
fetchStatus: fetchStatus_get_filterCustomer,
} = query_Get_FilterCustomer(debounceFilter);
useEffect(() => {
if (isSuccess_get_filterCustomer) {
setTbData(data_get_filterCustomer?.data);
}
if (isError_get_filterCustomer) {
console.log(error_get_filterCustomer);
}
}, [isSuccess_get_filterCustomer,data_get_filterCustomer,
isError_get_filterCustomer,error_get_filterCustomer]);
return (
<>
{/* Filter Fields */}
<TextField
variant="filled"
label="Customer No"
name="custNo"
onChange={(event) => handleFilter(event)}
/>
<TextField
variant="filled"
label="Customer Name"
name="custName"
onChange={(event) => handleFilter(event)}
/>
<TextField
variant="filled"
label="Phone No"
name="phoneNo"
onChange={(event) => handleFilter(event)}
/>
{/* Customer Table */}
<FyTable
columnDef={columnDef_FilterCustomer}
data={tbData}
columnDataType={columnType_FilterCustomer}
resetRowSelection={resetRowSelection}
handleSelectedRow={handleSelectedRow}
/>
</>
)}
export default TableCustomer
我的子表组件导出为memo
export default React.memo(FyTable);
个
一切正常,没有错误,但当我在任何过滤器TextField上输入文本时,它完全滞后,每按一次键都调用子组件
我同意如果父组件对状态值(here 100 onChange on TextFields)进行任何更改,这将重新呈现子组件
为了避免重新呈现,我try 使用useCallback钩子并记住子组件.它仍然像地狱般重现
我遗漏了什么?.请给我解释一下