Skip to content

Commit fa8e33c

Browse files
kaushik94diasbruno
authored andcommitted
removed un-safe lifecycle methods componentWillMount and componentWillUpdate. Implemented getDerivedStateFromProps and getSnapshotBeforeUpdate lifecycle methods using react-lifecycles-compat polyfill.
1 parent d8c3dad commit fa8e33c

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

Diff for: package.json

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"prettier": "^1.7.4",
5353
"react": "^16.0.0",
5454
"react-dom": "^16.0.0",
55+
"react-lifecycles-compat": "^1.1.0",
5556
"react-router": "^4.2.0",
5657
"react-router-dom": "^4.2.2",
5758
"should": "^13.1.0",

Diff for: src/components/Modal.js

+35-13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import ModalPortal from "./ModalPortal";
55
import * as ariaAppHider from "../helpers/ariaAppHider";
66
import SafeHTMLElement, { canUseDOM } from "../helpers/safeHTMLElement";
77

8+
import polyfill from "react-lifecycles-compat";
9+
810
export const portalClassName = "ReactModalPortal";
911
export const bodyOpenClassName = "ReactModal__Body--open";
1012

@@ -14,10 +16,12 @@ const createPortal = isReact16
1416
: ReactDOM.unstable_renderSubtreeIntoContainer;
1517

1618
function getParentElement(parentSelector) {
17-
return parentSelector();
19+
return parentSelector() || Modal.defaultProps.parentSelector;
1820
}
1921

20-
export default class Modal extends Component {
22+
class Modal extends Component {
23+
state = Object.assign({}, Modal.defaultProps);
24+
2125
static setAppElement(element) {
2226
ariaAppHider.setElement(element);
2327
}
@@ -76,9 +80,7 @@ export default class Modal extends Component {
7680
shouldCloseOnEsc: true,
7781
shouldCloseOnOverlayClick: true,
7882
shouldReturnFocusAfterClose: true,
79-
parentSelector() {
80-
return document.body;
81-
}
83+
parentSelector: () => document.body
8284
};
8385

8486
static defaultStyles = {
@@ -120,30 +122,46 @@ export default class Modal extends Component {
120122
!isReact16 && this.renderPortal(this.props);
121123
}
122124

123-
componentWillReceiveProps(newProps) {
124-
if (!canUseDOM) return;
125+
static getDerivedStateFromProps(newProps, prevState) {
126+
if (!canUseDOM) return null;
125127
const { isOpen } = newProps;
126128
// Stop unnecessary renders if modal is remaining closed
127-
if (!this.props.isOpen && !isOpen) return;
129+
if (prevState && !prevState.isOpen && !isOpen) return null;
128130

129-
const currentParent = getParentElement(this.props.parentSelector);
131+
const currentParent = getParentElement(prevState.parentSelector);
130132
const newParent = getParentElement(newProps.parentSelector);
131133

134+
const enumeratedState = {
135+
isOpen: newProps.isOpen,
136+
parentSelector: newProps.parentSelector,
137+
portalClassName: newProps.portalClassName
138+
};
139+
132140
if (newParent !== currentParent) {
133141
currentParent.removeChild(this.node);
134142
newParent.appendChild(this.node);
135143
}
136144

145+
const newState = Object.assign(prevState, enumeratedState);
137146
!isReact16 && this.renderPortal(newProps);
147+
return newState;
138148
}
139149

140-
componentWillUpdate(newProps) {
141-
if (!canUseDOM) return;
142-
if (newProps.portalClassName !== this.props.portalClassName) {
143-
this.node.className = newProps.portalClassName;
150+
getSnapshotBeforeUpdate(prevProps, prevState) {
151+
if (!canUseDOM) {
152+
return null;
153+
} else {
154+
this.node.className = prevState.portalClassName;
155+
return prevState.portalClassName;
144156
}
145157
}
146158

159+
/*eslint-disable no-unused-vars*/
160+
componentDidUpdate(prevProps, prevState) {
161+
// Just to satisfy polyfilling
162+
}
163+
/*eslint-enable no-unused-vars*/
164+
147165
componentWillUnmount() {
148166
if (!canUseDOM || !this.node || !this.portal) return;
149167

@@ -203,3 +221,7 @@ export default class Modal extends Component {
203221
);
204222
}
205223
}
224+
225+
polyfill(Modal);
226+
227+
export default Modal;

0 commit comments

Comments
 (0)