Use createRoot

This commit is contained in:
Nathan Bierema 2022-06-06 10:45:32 -04:00
parent ea5e4b06a7
commit 872eef74fa
15 changed files with 67 additions and 67 deletions

View File

@ -1,5 +1,5 @@
import React, { CSSProperties } from 'react'; import React, { CSSProperties } from 'react';
import { render, unmountComponentAtNode } from 'react-dom'; import { createRoot, Root } from 'react-dom/client';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { Persistor } from 'redux-persist'; import { Persistor } from 'redux-persist';
import { REMOVE_INSTANCE, StoreAction } from '@redux-devtools/app'; import { REMOVE_INSTANCE, StoreAction } from '@redux-devtools/app';
@ -27,23 +27,21 @@ let naTimeout: NodeJS.Timeout;
const isChrome = navigator.userAgent.indexOf('Firefox') === -1; const isChrome = navigator.userAgent.indexOf('Firefox') === -1;
function renderDevTools() { function renderDevTools(root: Root) {
const node = document.getElementById('root'); root.unmount();
unmountComponentAtNode(node!);
clearTimeout(naTimeout); clearTimeout(naTimeout);
({ store, persistor } = configureStore(position, bgConnection)); ({ store, persistor } = configureStore(position, bgConnection));
render( root.render(
<Provider store={store}> <Provider store={store}>
<PersistGate loading={null} persistor={persistor}> <PersistGate loading={null} persistor={persistor}>
<App position={position} /> <App position={position} />
</PersistGate> </PersistGate>
</Provider>, </Provider>
node
); );
rendered = true; rendered = true;
} }
function renderNA() { function renderNA(root: Root) {
if (rendered === false) return; if (rendered === false) return;
rendered = false; rendered = false;
naTimeout = setTimeout(() => { naTimeout = setTimeout(() => {
@ -76,32 +74,31 @@ function renderNA() {
); );
} }
const node = document.getElementById('root'); root.unmount();
unmountComponentAtNode(node!); root.render(message);
render(message, node);
store = undefined; store = undefined;
}); });
} else { } else {
const node = document.getElementById('root'); root.unmount();
unmountComponentAtNode(node!); root.render(message);
render(message, node);
store = undefined; store = undefined;
} }
}, 3500); }, 3500);
} }
function init(id: number) { function init(id: number) {
renderNA(); const root = createRoot(document.getElementById('root')!);
renderNA(root);
bgConnection = chrome.runtime.connect({ bgConnection = chrome.runtime.connect({
name: id ? id.toString() : undefined, name: id ? id.toString() : undefined,
}); });
bgConnection.onMessage.addListener( bgConnection.onMessage.addListener(
<S, A extends Action<unknown>>(message: PanelMessage<S, A>) => { <S, A extends Action<unknown>>(message: PanelMessage<S, A>) => {
if (message.type === 'NA') { if (message.type === 'NA') {
if (message.id === id) renderNA(); if (message.id === id) renderNA(root);
else store!.dispatch({ type: REMOVE_INSTANCE, id: message.id }); else store!.dispatch({ type: REMOVE_INSTANCE, id: message.id });
} else { } else {
if (!rendered) renderDevTools(); if (!rendered) renderDevTools(root);
store!.dispatch(message); store!.dispatch(message);
} }
} }

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import OptionsComponent from './Options'; import OptionsComponent from './Options';
import { Options } from './syncOptions'; import { Options } from './syncOptions';
@ -13,10 +13,8 @@ chrome.runtime.getBackgroundPage((background) => {
}; };
const renderOptions = (options: Options) => { const renderOptions = (options: Options) => {
render( const root = createRoot(document.getElementById('root')!);
<OptionsComponent options={options} saveOption={saveOption} />, root.render(<OptionsComponent options={options} saveOption={saveOption} />);
document.getElementById('root')
);
}; };
syncOptions.subscribe(renderOptions); syncOptions.subscribe(renderOptions);

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react'; import { PersistGate } from 'redux-persist/integration/react';
import { UPDATE_STATE } from '@redux-devtools/app'; import { UPDATE_STATE } from '@redux-devtools/app';
@ -25,13 +25,13 @@ chrome.runtime.getBackgroundPage((window) => {
bg.onMessage.addListener(update); bg.onMessage.addListener(update);
update(); update();
render( const root = createRoot(document.getElementById('root')!);
root.render(
<Provider store={localStore}> <Provider store={localStore}>
<PersistGate loading={null} persistor={persistor}> <PersistGate loading={null} persistor={persistor}>
<App position={position} /> <App position={position} />
</PersistGate> </PersistGate>
</Provider>, </Provider>
document.getElementById('root')
); );
}); });

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import { Root } from '@redux-devtools/app'; import { Root } from '@redux-devtools/app';
import '../../views/remote.pug'; import '../../views/remote.pug';
@ -15,7 +15,8 @@ chrome.storage.local.get(
}, },
(options) => { (options) => {
const AppAsAny = Root as any; const AppAsAny = Root as any;
render( const root = createRoot(document.getElementById('root')!);
root.render(
<AppAsAny <AppAsAny
selectMonitor={options['select-monitor']} selectMonitor={options['select-monitor']}
testTemplates={options['test-templates']} testTemplates={options['test-templates']}
@ -30,8 +31,7 @@ chrome.storage.local.get(
} }
: undefined : undefined
} }
/>, />
document.getElementById('root')
); );
} }
); );

View File

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom/client';
import App from './App'; import App from './App';
ReactDOM.render(<App />, document.getElementById('root')); const root = ReactDOM.createRoot(document.getElementById('root')!);
root.render(<App />);

View File

@ -1,5 +1,6 @@
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import React from 'react'; import React from 'react';
import App from './App'; import App from './App';
render(<App />, document.getElementById('root')); const root = createRoot(document.getElementById('root')!);
root.render(<App />);

View File

@ -16,10 +16,11 @@ Also it's a react component you can use to build amazing monitor applications li
```js ```js
import React from 'react'; import React from 'react';
import ReactDom from 'react-dom'; import ReactDOM from 'react-dom/client';
import { Root } from '@redux-devtools/app'; import { Root } from '@redux-devtools/app';
ReactDom.render(<Root />, document.getElementById('root')); const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Root />);
``` ```
### Parameters ### Parameters

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import { Root } from '../src'; import { Root } from '../src';
render(<Root />, document.getElementById('root')); const root = createRoot(document.getElementById('root')!);
root.render(<Root />);
if (module.hot) { if (module.hot) {
// https://github.com/webpack/webpack/issues/418#issuecomment-53398056 // https://github.com/webpack/webpack/issues/418#issuecomment-53398056

View File

@ -31,16 +31,15 @@
<script src="/redux-devtools-app.min.js"></script> <script src="/redux-devtools-app.min.js"></script>
<script src="/port.js"></script> <script src="/port.js"></script>
<script> <script>
ReactDOM.render( const container = document.querySelector('#root');
React.createElement(ReduxDevToolsApp, { const element = React.createElement(ReduxDevToolsApp, {
socketOptions: { socketOptions: {
hostname: location.hostname, hostname: location.hostname,
port: reduxDevToolsPort, port: reduxDevToolsPort,
autoReconnect: true, autoReconnect: true,
}, },
}), })
document.querySelector('#root') ReactDOM.createRoot(container).render(element);
);
</script> </script>
</body> </body>
</html> </html>

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import { Container } from '@redux-devtools/ui'; import { Container } from '@redux-devtools/ui';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { import {
@ -50,7 +50,8 @@ const enhancer = compose(
const store = createStore(rootReducer, enhancer); const store = createStore(rootReducer, enhancer);
render( const root = createRoot(document.getElementById('root')!);
root.render(
<Provider store={store}> <Provider store={store}>
<BrowserRouter> <BrowserRouter>
<Container <Container
@ -66,6 +67,5 @@ render(
{!useDevtoolsExtension && <ConnectedDevTools />} {!useDevtoolsExtension && <ConnectedDevTools />}
</Container> </Container>
</BrowserRouter> </BrowserRouter>
</Provider>, </Provider>
document.getElementById('root')
); );

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { import {
createStore, createStore,
@ -49,7 +49,8 @@ const enhancer = compose(
const store = createStore(rootReducer, enhancer); const store = createStore(rootReducer, enhancer);
render( const root = createRoot(document.getElementById('root')!);
root.render(
<Provider store={store}> <Provider store={store}>
<BrowserRouter> <BrowserRouter>
<Routes> <Routes>
@ -57,6 +58,5 @@ render(
</Routes> </Routes>
{!useDevtoolsExtension && <ConnectedDevTools />} {!useDevtoolsExtension && <ConnectedDevTools />}
</BrowserRouter> </BrowserRouter>
</Provider>, </Provider>
document.getElementById('root')
); );

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { ChakraProvider } from '@chakra-ui/react'; import { ChakraProvider } from '@chakra-ui/react';
import './index.css'; import './index.css';
@ -11,8 +11,8 @@ import { worker } from './mocks/browser';
function renderApp() { function renderApp() {
const rootElement = document.getElementById('root'); const rootElement = document.getElementById('root');
const root = ReactDOM.createRoot(rootElement!);
ReactDOM.render( root.render(
<Provider store={store}> <Provider store={store}>
<ChakraProvider> <ChakraProvider>
<BrowserRouter> <BrowserRouter>
@ -20,8 +20,7 @@ function renderApp() {
<DevTools /> <DevTools />
</BrowserRouter> </BrowserRouter>
</ChakraProvider> </ChakraProvider>
</Provider>, </Provider>
rootElement
); );
} }

View File

@ -1,10 +1,11 @@
import 'todomvc-app-css/index.css'; import 'todomvc-app-css/index.css';
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom/client';
import configureStore from './store/configureStore'; import configureStore from './store/configureStore';
import Root from './containers/Root'; import Root from './containers/Root';
const store = configureStore(); const store = configureStore();
const rootEl = document.getElementById('root'); const rootEl = document.getElementById('root');
ReactDOM.render(<Root store={store} />, rootEl); const root = ReactDOM.createRoot(rootEl!);
root.render(<Root store={store} />);

View File

@ -1,8 +1,9 @@
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import configureStore from './store/configureStore'; import configureStore from './store/configureStore';
import Root from './containers/Root'; import Root from './containers/Root';
const store = configureStore(); const store = configureStore();
render(<Root store={store} />, document.getElementById('root')); const root = createRoot(document.getElementById('root')!);
root.render(<Root store={store} />);

View File

@ -1,9 +1,10 @@
import 'todomvc-app-css/index.css'; import 'todomvc-app-css/index.css';
import React from 'react'; import React from 'react';
import { render } from 'react-dom'; import { createRoot } from 'react-dom/client';
import configureStore from './store/configureStore'; import configureStore from './store/configureStore';
import Root from './containers/Root'; import Root from './containers/Root';
const store = configureStore(); const store = configureStore();
render(<Root store={store} />, document.getElementById('root')); const root = createRoot(document.getElementById('root')!);
root.render(<Root store={store} />);