Skip to content

Commit 9bec1cc

Browse files
authored
Update examples to React 18 API and fix a problem in the lib under React 18 (Merge PR #51)
2 parents 229c0a7 + 522ea20 commit 9bec1cc

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

examples/index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import ReactDOM from 'react-dom';
2+
import ReactDOMClient from 'react-dom/client';
33
import { HashRouter as Router, Route, NavLink, Routes } from 'react-router-dom';
44

55
import SimpleMenu from './SimpleMenu';
@@ -78,9 +78,9 @@ function App() {
7878
);
7979
}
8080

81-
ReactDOM.render(
81+
const root = ReactDOMClient.createRoot(document.getElementById('main'));
82+
root.render(
8283
<Router>
8384
<App />
84-
</Router>,
85-
document.getElementById('main')
85+
</Router>
8686
);

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151
},
5252
"peerDependencies": {
5353
"prop-types": "^15.0.0",
54-
"react": "^0.14.0 || ^15.0.0 || ^16.0.1",
55-
"react-dom": "^0.14.0 || ^15.0.0 || ^16.0.1"
54+
"react": "^0.14.0 || ^15.0.0 || ^16.0.1 || ^17.0.0 || ^18.0.0",
55+
"react-dom": "^0.14.0 || ^15.0.0 || ^16.0.1 || ^17.0.0 || ^18.0.0"
5656
},
5757
"devDependencies": {
5858
"@babel/cli": "^7.17.6",

src/ContextMenu.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React from 'react';
2+
import ReactDOM from 'react-dom';
23
import PropTypes from 'prop-types';
34
import cx from 'classnames';
45
import assign from 'object-assign';
@@ -9,6 +10,15 @@ import SubMenu from './SubMenu';
910
import { hideMenu } from './actions';
1011
import { cssClasses, callIfExists, store } from './helpers';
1112

13+
/* This is a backward-compatible shim for React < 18 */
14+
function flushSync(callback) {
15+
if (ReactDOM.flushSync) {
16+
ReactDOM.flushSync(callback);
17+
} else {
18+
callback();
19+
}
20+
}
21+
1222
export default class ContextMenu extends AbstractMenu {
1323
static propTypes = {
1424
id: PropTypes.string.isRequired,
@@ -124,7 +134,11 @@ export default class ContextMenu extends AbstractMenu {
124134
handleHide = (e) => {
125135
if (this.state.isVisible && (!e.detail || !e.detail.id || e.detail.id === this.props.id)) {
126136
this.unregisterHandlers();
127-
this.setState({ isVisible: false, selectedItem: null, forceSubMenuOpen: false });
137+
flushSync(() => {
138+
/* We rely on being able to read this state change in handleShow,
139+
* so let's force a synchronous update in React 18. */
140+
this.setState({ isVisible: false, selectedItem: null, forceSubMenuOpen: false });
141+
});
128142
callIfExists(this.props.onHide, e);
129143
}
130144
};

0 commit comments

Comments
 (0)