Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 86701f2

Browse files
authored
fix: schedule an update when placements change (#207)
1 parent 1a25f09 commit 86701f2

File tree

4 files changed

+1714
-1050
lines changed

4 files changed

+1714
-1050
lines changed

.size-snapshot.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
{
22
"dist/index.umd.js": {
3-
"bundled": 49663,
4-
"minified": 17800,
5-
"gzipped": 5697
3+
"bundled": 49222,
4+
"minified": 17476,
5+
"gzipped": 5540
66
},
77
"dist/index.umd.min.js": {
8-
"bundled": 25322,
9-
"minified": 10167,
10-
"gzipped": 3405
8+
"bundled": 23917,
9+
"minified": 9697,
10+
"gzipped": 3231
1111
},
1212
"dist/index.esm.js": {
13-
"bundled": 9679,
14-
"minified": 5577,
15-
"gzipped": 1739,
13+
"bundled": 9538,
14+
"minified": 5425,
15+
"gzipped": 1716,
1616
"treeshaked": {
1717
"rollup": {
18-
"code": 4623,
18+
"code": 4469,
1919
"import_statements": 137
2020
},
2121
"webpack": {
22-
"code": 5357
22+
"code": 5590
2323
}
2424
}
2525
}

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@
5858
"react": "0.14.x || ^15.0.0 || ^16.0.0"
5959
},
6060
"dependencies": {
61-
"babel-plugin-transform-class-properties": "^6.24.1",
62-
"babel-runtime": "6.x.x",
6361
"create-react-context": "^0.2.1",
6462
"popper.js": "^1.14.1",
6563
"prop-types": "^15.6.1",
@@ -73,6 +71,7 @@
7371
"babel-eslint": "^8.2.2",
7472
"babel-jest": "^22.4.3",
7573
"babel-plugin-external-helpers": "^6.22.0",
74+
"babel-plugin-transform-class-properties": "^6.24.1",
7675
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
7776
"babel-plugin-transform-runtime": "^6.23.0",
7877
"babel-preset-env": "^1.6.1",

src/Popper.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export type PopperProps = {
4242

4343
type PopperState = {
4444
data: ?Data,
45+
placement: ?Placement,
4546
};
4647

4748
const initialStyle = {
@@ -64,6 +65,7 @@ export class InnerPopper extends React.Component<PopperProps, PopperState> {
6465

6566
state = {
6667
data: undefined,
68+
placement: undefined,
6769
};
6870

6971
popperInstance: ?PopperJS$Instance;
@@ -91,7 +93,11 @@ export class InnerPopper extends React.Component<PopperProps, PopperState> {
9193
enabled: true,
9294
order: 900,
9395
fn: (data: Object) => {
94-
this.setState({ data });
96+
const { placement } = data;
97+
this.setState(
98+
{ data, placement },
99+
placement !== this.state.placement ? this.scheduleUpdate : undefined
100+
);
95101
return data;
96102
},
97103
};
@@ -120,7 +126,7 @@ export class InnerPopper extends React.Component<PopperProps, PopperState> {
120126
};
121127

122128
getPopperPlacement = () =>
123-
!this.state.data ? undefined : this.state.data.placement;
129+
!this.state.data ? undefined : this.state.placement;
124130

125131
getArrowStyle = () =>
126132
!this.arrowNode || !this.state.data
@@ -158,7 +164,7 @@ export class InnerPopper extends React.Component<PopperProps, PopperState> {
158164
}
159165
};
160166

161-
componentDidUpdate(prevProps: PopperProps) {
167+
componentDidUpdate(prevProps: PopperProps, prevState: PopperState) {
162168
// If the Popper.js options have changed, update the instance (destroy + create)
163169
if (
164170
this.props.placement !== prevProps.placement ||
@@ -167,6 +173,15 @@ export class InnerPopper extends React.Component<PopperProps, PopperState> {
167173
this.props.positionFixed !== prevProps.positionFixed
168174
) {
169175
this.updatePopperInstance();
176+
return;
177+
}
178+
179+
// A placement difference in state means popper determined a new placement
180+
// apart from the props value. By the time the popper element is rendered with
181+
// the new position Popper has already measured it, if the place change triggers
182+
// a size change it will result in a misaligned popper. So we schedule an update to be sure.
183+
if (prevState.placement !== this.state.placement) {
184+
this.scheduleUpdate();
170185
}
171186
}
172187

0 commit comments

Comments
 (0)