Skip to content

Commit c57f4bc

Browse files
authored
Merge pull request #137 from react-component/fix-getContainer
fix getContainer no body, overflow: hidden does not delete
2 parents 256f6dd + 8a8e3c0 commit c57f4bc

File tree

2 files changed

+50
-23
lines changed

2 files changed

+50
-23
lines changed

src/DrawerChild.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,18 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
9898
} catch (err) {}
9999
this.passive = passiveSupported ? { passive: false } : false;
100100
}
101-
const { open } = this.props;
101+
const { open, getContainer } = this.props;
102+
const container = getContainer && getContainer();
102103
this.drawerId = `drawer_id_${Number(
103104
(Date.now() + Math.random())
104105
.toString()
105106
.replace('.', Math.round(Math.random() * 9).toString()),
106107
).toString(16)}`;
107108
this.getLevelDom(this.props);
108109
if (open) {
109-
currentDrawer[this.drawerId] = open;
110+
if (container && container.parentNode === document.body) {
111+
currentDrawer[this.drawerId] = open;
112+
}
110113
// 默认打开状态时推出 level;
111114
this.openLevelTransition();
112115
this.forceUpdate(() => {
@@ -116,12 +119,15 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
116119
}
117120

118121
public componentDidUpdate(prevProps: IDrawerChildProps) {
119-
const { open } = this.props;
122+
const { open, getContainer } = this.props;
123+
const container = getContainer && getContainer();
120124
if (open !== prevProps.open) {
121125
if (open) {
122126
this.domFocus();
123127
}
124-
currentDrawer[this.drawerId] = !!open;
128+
if (container && container.parentNode === document.body) {
129+
currentDrawer[this.drawerId] = !!open;
130+
}
125131
this.openLevelTransition();
126132
}
127133
}
@@ -238,7 +244,7 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
238244
) => {
239245
const { placement, levelMove, duration, ease, showMask } = this.props;
240246
// router 切换时可能会导至页面失去滚动条,所以需要时时获取。
241-
this.levelDom.forEach((dom) => {
247+
this.levelDom.forEach(dom => {
242248
dom.style.transition = `transform ${duration} ${ease}`;
243249
addEventListener(dom, transitionEnd, this.transitionEnd);
244250
let levelValue = open ? value : 0;
@@ -436,7 +442,7 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
436442
};
437443

438444
private getCurrentDrawerSome = () =>
439-
!Object.keys(currentDrawer).some((key) => currentDrawer[key]);
445+
!Object.keys(currentDrawer).some(key => currentDrawer[key]);
440446

441447
private getLevelDom = ({ level, getContainer }: IDrawerChildProps) => {
442448
if (windowIsUndefined) {
@@ -460,8 +466,8 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
460466
}
461467
});
462468
} else if (level) {
463-
dataToArray(level).forEach((key) => {
464-
document.querySelectorAll(key).forEach((item) => {
469+
dataToArray(level).forEach(key => {
470+
document.querySelectorAll(key).forEach(item => {
465471
this.levelDom.push(item);
466472
});
467473
});
@@ -556,7 +562,7 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
556562
className={`${prefixCls}-mask`}
557563
onClick={maskClosable ? onClose : undefined}
558564
style={maskStyle}
559-
ref={(c) => {
565+
ref={c => {
560566
this.maskDom = c as HTMLElement;
561567
}}
562568
/>
@@ -569,13 +575,13 @@ class DrawerChild extends React.Component<IDrawerChildProps, IState> {
569575
width: isNumeric(width) ? `${width}px` : width,
570576
height: isNumeric(height) ? `${height}px` : height,
571577
}}
572-
ref={(c) => {
578+
ref={c => {
573579
this.contentWrapper = c as HTMLElement;
574580
}}
575581
>
576582
<div
577583
className={`${prefixCls}-content`}
578-
ref={(c) => {
584+
ref={c => {
579585
this.contentDom = c as HTMLElement;
580586
}}
581587
onTouchStart={

tests/index.spec.tsx

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { mount } from 'enzyme';
22
import * as React from 'react';
33
import toJson from 'enzyme-to-json';
4-
import Drawer from '../src/';
4+
import Drawer from '../src';
55

66
function Div(props) {
7-
const { show, ...otherProps } = props
7+
const { show, ...otherProps } = props;
88
return (
99
<div className="div-wrapper">
10-
{show && <Drawer wrapperClassName="drawer-wrapper" defaultOpen {...otherProps} />}
10+
{show && (
11+
<Drawer wrapperClassName="drawer-wrapper" defaultOpen {...otherProps} />
12+
)}
1113
</div>
1214
);
1315
}
@@ -18,7 +20,11 @@ function DrawerComp(props: { open?: boolean }) {
1820
<div id="a" style={{ position: 'absolute', top: 0, left: 0 }}>
1921
test1
2022
</div>
21-
<Drawer getContainer={null} open={props.open} wrapperClassName="drawer-wrapper" />
23+
<Drawer
24+
getContainer={null}
25+
open={props.open}
26+
wrapperClassName="drawer-wrapper"
27+
/>
2228
</div>
2329
);
2430
}
@@ -32,7 +38,10 @@ function createStartTouchEventObject({ x = 0, y = 0 }) {
3238
}
3339

3440
function createMoveTouchEventObject({ x = 0, y = 0 }) {
35-
return { touches: [createClientXY(x, y)], changedTouches: [createClientXY(x, y)] };
41+
return {
42+
touches: [createClientXY(x, y)],
43+
changedTouches: [createClientXY(x, y)],
44+
};
3645
}
3746

3847
describe('rc-drawer-menu', () => {
@@ -64,11 +73,19 @@ describe('rc-drawer-menu', () => {
6473
});
6574

6675
it('default open drawer', () => {
67-
instance = mount(<Drawer handler={<i className="a">a</i>} defaultOpen={true} level={[]} />);
76+
instance = mount(
77+
<Drawer handler={<i className="a">a</i>} defaultOpen level={[]} />,
78+
);
6879
const drawer = instance.find('.drawer-content-wrapper').instance() as any;
6980
const content = instance.find('.drawer-content');
70-
content.simulate('touchStart', createStartTouchEventObject({ x: 100, y: 0 }));
71-
content.simulate('touchMove', createMoveTouchEventObject({ x: 150, y: 10 }));
81+
content.simulate(
82+
'touchStart',
83+
createStartTouchEventObject({ x: 100, y: 0 }),
84+
);
85+
content.simulate(
86+
'touchMove',
87+
createMoveTouchEventObject({ x: 150, y: 10 }),
88+
);
7289
content.simulate('touchEnd', createMoveTouchEventObject({ x: 200, y: 0 }));
7390
content.simulate('touchStart', createStartTouchEventObject({ x: 0, y: 0 }));
7491
content.simulate('touchMove', createMoveTouchEventObject({ x: 0, y: 10 }));
@@ -78,7 +95,7 @@ describe('rc-drawer-menu', () => {
7895
});
7996

8097
it('handler is null,open=true', () => {
81-
instance = mount(<Drawer handler={null} open={true} level={null} />);
98+
instance = mount(<Drawer handler={null} open level={null} />);
8299
expect(toJson(instance.render())).toMatchSnapshot();
83100
});
84101
it('handler is null,open=false', () => {
@@ -111,12 +128,16 @@ describe('rc-drawer-menu', () => {
111128
it('getContainer is null', () => {
112129
instance = mount(
113130
<div className="react-wrapper">
114-
<div id="a" className="a" style={{ position: 'absolute', top: 0, left: 0 }}>
131+
<div
132+
id="a"
133+
className="a"
134+
style={{ position: 'absolute', top: 0, left: 0 }}
135+
>
115136
test1
116137
</div>
117138
<Drawer
118139
getContainer={null}
119-
defaultOpen={true}
140+
defaultOpen
120141
level="#a"
121142
wrapperClassName="drawer-wrapper"
122143
/>
@@ -146,7 +167,7 @@ describe('rc-drawer-menu', () => {
146167
expect(content.style.transform).toBe('translateX(-100%)');
147168
});
148169
it('will unmount', () => {
149-
instance = mount(<Div show={true} />);
170+
instance = mount(<Div show />);
150171
const divWrapper = instance.find('.div-wrapper').instance() as any;
151172
const content = instance.find('.drawer-content-wrapper').instance() as any;
152173
console.log(content.style.transform);

0 commit comments

Comments
 (0)