Jst*_*uff 5 reactjs ag-grid react-hooks
我query在函数内部使用状态变量isExternalFilterPresent永远不会更新。我感到困惑,因为第一次console.log的query与查询的每个变化更新。我想这是因为我不太了解钩子的实现。
let gridApi: GridApi | null = null;
const HouseholdTable = ({accountsData, aggregateEntityTable: {aggregateEntity, columnDefs}}: OwnProps & StateProps) => {
const [isDeepDiveOpen, setIsDeepDiveOpen] = useState(false);
const [query, setQuery] = useState('');
useEffect(() => {
gridApi && gridApi.onFilterChanged();
}, [query]);
if (accountsData) {
const onGridReady = ({api}: GridReadyEvent) => {
api.sizeColumnsToFit();
gridApi = api;
};
const aggData = accountsData.aggregations[aggregateEntity];
console.log(query); // This updates when query changes
const isExternalFilterPresent = (): boolean => {
console.log(query); // This never updates
return !!query;
};
const doesExternalFilterPass = (rowNode: RowNode): boolean => {
// console.log('doesExternalFilterPass');
return true;
};
return (
<>
<HouseholdsToolbar aggData={aggData}
isDeepDiveOpen={isDeepDiveOpen}
onDeepDiveToggleClick={setIsDeepDiveOpen}
onQueryChange={setQuery}
/>
<AgGridReact rowData={[]}
columnDefs={[]}
gridOptions={{
headerHeight: 70,
suppressFieldDotNotation: true,
suppressHorizontalScroll: false,
onGridReady,
isExternalFilterPresent,
doesExternalFilterPass
}}
/>
</>
);
} else {
// handle loading
return (<div>loading</div>);
}
};
const mapStateToProps = (state: StoreState): StateProps => {
const {faStore: {accountsData}} = state;
return {
accountsData,
aggregateEntityTable: aggregateEntityTableDummyConfig
};
};
export default connect(mapStateToProps)(HouseholdTable);
export const aggregateEntityTableDummyConfig: AggregateEntityTable = {
aggregateEntity: 'FOO',
columnDefs: []
};
Run Code Online (Sandbox Code Playgroud)
编辑:更新了整个组件。
钩子不是问题。看起来在第一次渲染时AgGridReact存储对您传递给的函数的引用isExternalFilterPresent,然后在重新渲染时永远不会更改此引用。更清楚地说,AgGridReact存储第一个“版本”isExternalFilterPresent并且从不更新它。要解决您的问题,您需要将过滤器的值存储在useRef钩子中。
反应文档说:
useRef() 钩子不仅仅用于 DOM 引用。“ref”对象是一个通用容器,其当前属性是可变的并且可以保存任何值,类似于类上的实例属性。
因此,您可能会将 useRef 视为类中的属性。
在这里你必须做的:
const query = useRef(null);
const setQuery = (value) => {
query.current = value;
gridApi && gridApi.onFilterChanged();
}
const isExternalFilterPresent = (): boolean => {
console.log(query.current); // Now it changes
return !!query.current;
};
Run Code Online (Sandbox Code Playgroud)
这里有一个关于代码和框的例子
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |