Browse Source

fix: Affix shake when switching from hide to show (#38410)

* fix: do not measure when Affix is hidden

* feat: add test
pull/38421/head
章鱼怪 2 years ago
committed by GitHub
parent
commit
0438b0bbca
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      components/affix/__tests__/Affix.test.tsx
  2. 9
      components/affix/index.tsx

31
components/affix/__tests__/Affix.test.tsx

@ -15,6 +15,7 @@ class AffixMounter extends React.Component<{
onTestUpdatePosition?(): void; onTestUpdatePosition?(): void;
onChange?: () => void; onChange?: () => void;
getInstance?: (inst: InternalAffixClass) => void; getInstance?: (inst: InternalAffixClass) => void;
style?: React.CSSProperties;
}> { }> {
private container: HTMLDivElement; private container: HTMLDivElement;
@ -201,6 +202,7 @@ describe('Affix Render', () => {
expect(getObserverEntities()).toHaveLength(1); expect(getObserverEntities()).toHaveLength(1);
expect(getObserverEntities()[0].target).toBe(window); expect(getObserverEntities()[0].target).toBe(window);
}); });
it('check position change before measure', async () => { it('check position change before measure', async () => {
const { container } = render( const { container } = render(
<> <>
@ -216,6 +218,35 @@ describe('Affix Render', () => {
await movePlaceholder(1000); await movePlaceholder(1000);
expect(container.querySelector('.ant-affix')).toBeTruthy(); expect(container.querySelector('.ant-affix')).toBeTruthy();
}); });
it('do not measure when hidden', async () => {
let affixInstance: InternalAffixClass | null = null;
const { rerender } = render(
<AffixMounter
getInstance={inst => {
affixInstance = inst;
}}
offsetBottom={0}
/>,
);
await waitFakeTimer();
const firstAffixStyle = affixInstance!.state.affixStyle;
rerender(
<AffixMounter
getInstance={inst => {
affixInstance = inst;
}}
offsetBottom={0}
style={{ display: 'none' }}
/>,
);
await waitFakeTimer();
const secondAffixStyle = affixInstance!.state.affixStyle;
expect(firstAffixStyle).toEqual(secondAffixStyle);
});
}); });
describe('updatePosition when size changed', () => { describe('updatePosition when size changed', () => {

9
components/affix/index.tsx

@ -169,6 +169,15 @@ class Affix extends React.Component<InternalAffixProps, AffixState> {
const fixedTop = getFixedTop(placeholderReact, targetRect, offsetTop); const fixedTop = getFixedTop(placeholderReact, targetRect, offsetTop);
const fixedBottom = getFixedBottom(placeholderReact, targetRect, offsetBottom); const fixedBottom = getFixedBottom(placeholderReact, targetRect, offsetBottom);
if (
placeholderReact.top === 0 &&
placeholderReact.left === 0 &&
placeholderReact.width === 0 &&
placeholderReact.height === 0
) {
return;
}
if (fixedTop !== undefined) { if (fixedTop !== undefined) {
newState.affixStyle = { newState.affixStyle = {
position: 'fixed', position: 'fixed',

Loading…
Cancel
Save