Skip to content

Commit

Permalink
fix: Table render twice on first mount (#34106)
Browse files Browse the repository at this point in the history
* fix: Table render twice

* chore: clean up

* test: Fix test case
  • Loading branch information
zombieJ committed Feb 17, 2022
1 parent 106acb7 commit 9f602aa
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 519 deletions.
15 changes: 10 additions & 5 deletions components/grid/hooks/useBreakpoint.tsx
@@ -1,18 +1,23 @@
import { useEffect, useState } from 'react';
import { useEffect, useRef } from 'react';
import useForceUpdate from '../../_util/hooks/useForceUpdate';
import ResponsiveObserve, { ScreenMap } from '../../_util/responsiveObserve';

function useBreakpoint(): ScreenMap {
const [screens, setScreens] = useState<ScreenMap>({});
function useBreakpoint(refreshOnChange: boolean = true): ScreenMap {
const screensRef = useRef<ScreenMap>({});
const forceUpdate = useForceUpdate();

useEffect(() => {
const token = ResponsiveObserve.subscribe(supportScreens => {
setScreens(supportScreens);
screensRef.current = supportScreens;
if (refreshOnChange) {
forceUpdate();
}
});

return () => ResponsiveObserve.unsubscribe(token);
}, []);

return screens;
return screensRef.current;
}

export default useBreakpoint;
16 changes: 13 additions & 3 deletions components/table/Table.tsx
Expand Up @@ -139,15 +139,25 @@ function InternalTable<RecordType extends object = any>(
'`index` parameter of `rowKey` function is deprecated. There is no guarantee that it will work as expected.',
);

const screens = useBreakpoint();
const baseColumns = React.useMemo(
() => columns || convertChildrenToColumns(children),
[columns, children],
);
const needResponsive = React.useMemo(
() => baseColumns.some((col: ColumnType<RecordType>) => col.responsive),
[baseColumns],
);

const screens = useBreakpoint(needResponsive);

const mergedColumns = React.useMemo(() => {
const matched = new Set(Object.keys(screens).filter((m: Breakpoint) => screens[m]));

return (columns || convertChildrenToColumns(children)).filter(
return baseColumns.filter(
(c: ColumnType<RecordType>) =>
!c.responsive || c.responsive.some((r: Breakpoint) => matched.has(r)),
);
}, [children, columns, screens]);
}, [baseColumns, screens]);

const tableProps = omit(props, ['className', 'style', 'columns']) as TableProps<RecordType>;

Expand Down
11 changes: 6 additions & 5 deletions components/table/__tests__/Table.filter.test.js
Expand Up @@ -1100,7 +1100,7 @@ describe('Table.filter', () => {
it('should support getPopupContainer', () => {
const getPopupContainer = jest.fn(node => node.parentNode);

const wrapper = mount(
mount(
createTable({
columns: [
{
Expand All @@ -1111,13 +1111,14 @@ describe('Table.filter', () => {
getPopupContainer,
}),
);
expect(wrapper.render()).toMatchSnapshot();
expect(getPopupContainer).toHaveBeenCalled();
});

it('should support getPopupContainer from ConfigProvider', () => {
const wrapper = mount(
<ConfigProvider getPopupContainer={node => node.parentNode}>
const getPopupContainer = jest.fn(node => node.parentNode);

mount(
<ConfigProvider getPopupContainer={getPopupContainer}>
{createTable({
columns: [
{
Expand All @@ -1128,7 +1129,7 @@ describe('Table.filter', () => {
})}
</ConfigProvider>,
);
expect(wrapper.render()).toMatchSnapshot();
expect(getPopupContainer).toHaveBeenCalled();
});

it('pass visible prop to filterDropdown', () => {
Expand Down

0 comments on commit 9f602aa

Please sign in to comment.