Skip to content

Commit ca02040

Browse files
authored
fix: appeared again after closing and disappeared very quickly (#39)
* fix: appeared again after closing and disappeared very quickly * fix: add test case * fix: add test case * fix: 修复!removeOnLeave 因为没有 leavedCLassName 而走到最后的 motionChildren = null 分支
1 parent d164f7f commit ca02040

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/CSSMotion.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,12 @@ export function genCSSMotion(
185185
// Stable children
186186
if (mergedVisible) {
187187
motionChildren = children({ ...mergedProps }, setNodeRef);
188-
} else if (!removeOnLeave && renderedRef.current) {
188+
} else if (!removeOnLeave && renderedRef.current && leavedClassName) {
189189
motionChildren = children(
190190
{ ...mergedProps, className: leavedClassName },
191191
setNodeRef,
192192
);
193-
} else if (forceRender) {
193+
} else if ( forceRender || (!removeOnLeave && !leavedClassName)) {
194194
motionChildren = children(
195195
{ ...mergedProps, style: { display: 'none' } },
196196
setNodeRef,

tests/CSSMotion.spec.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,59 @@ describe('CSSMotion', () => {
159159
},
160160
);
161161

162+
it('leaveClassName should add to dom', () => {
163+
const genMotion = (props) => {
164+
const {visible,leavedClassName} = props
165+
return (
166+
<CSSMotion
167+
motionName="transition"
168+
visible={visible}
169+
removeOnLeave={false}
170+
leavedClassName={leavedClassName}
171+
>
172+
{({ style, className }) => {
173+
return (
174+
<div
175+
style={style}
176+
className={classNames('motion-box', className)}
177+
/>
178+
);
179+
}}
180+
</CSSMotion>
181+
);
182+
};
183+
const { container, rerender } = render(genMotion({visible:false}));
184+
185+
rerender(genMotion({ visible: true }));
186+
187+
act(() => {
188+
jest.runAllTimers();
189+
});
190+
191+
expect(container.querySelector('.motion-box')).toBeTruthy();
192+
rerender(genMotion({ visible: false,leavedClassName:'removed'}));
193+
act(() => {
194+
jest.runAllTimers();
195+
});
196+
197+
fireEvent.transitionEnd(container.querySelector('.motion-box'));
198+
199+
expect(container.querySelector('.motion-box')).toHaveClass('removed');
200+
201+
rerender(genMotion({ visible: true }));
202+
act(() => {
203+
jest.runAllTimers();
204+
});
205+
rerender(genMotion({ visible: false }));
206+
act(() => {
207+
jest.runAllTimers();
208+
});
209+
210+
fireEvent.transitionEnd(container.querySelector('.motion-box'));
211+
expect(container.querySelector('.motion-box')?.classList.contains('removed')).toBeFalsy();
212+
213+
});
214+
162215
it('stop transition if config motion to false', () => {
163216
const genMotion = (props?: CSSMotionProps) => (
164217
<CSSMotion motionName="transition" visible {...props}>

0 commit comments

Comments
 (0)