javascript - Aviso de descontinuação: ReactDOM.render não é mais suportado no React 18
Eu recebo este erro toda vez que crio um novo aplicativo React:
Aviso: ReactDOM.render não é mais suportado no React 18. Use createRoot em vez disso. Até você mudar para a nova API, seu aplicativo se comportará como se estivesse rodando o React 17. Saiba mais: https://reactjs.org/link/switch-to-createroot
Como posso consertar isso?
Eu criei meu aplicativo React usando:
npx create-react-app my-app
Resposta #1
No seu arquivo index.js, altere para:
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
reportWebVitals();
Para TypeScript
Crédito da seção de comentários abaixo da resposta: Kibonge Murphy
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
reportWebVitals();
Resposta #2
O React 18 foi lançado em 29 de março de 2022. ReactDOM.render foi descontinuado no React 18 e atualmente emite um aviso e funciona em um modo compatível.
Deprecações
Descontinuações
react-dom:ReactDOM.renderfoi descontinuado. Usá-lo irá gerar um aviso e executar seu aplicativo no modo React 17. :react-dom:ReactDOM.hydratefoi descontinuado. Usá-lo irá gerar um aviso e executar seu aplicativo no modo React 17.react-dom:ReactDOM.unmountComponentAtNodefoi descontinuado.react-dom:ReactDOM.renderSubtreeIntoContainerfoi descontinuado.react-dom/server:ReactDOMServer.renderToNodeStreamfoi descontinuado.
Para resolver isso, você pode reverter para uma versão anterior do React ou atualizar seu arquivo index.js para se alinhar à sintaxe do React 18.
Exemplo :
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
root.render(
<StrictMode>
<App />
</StrictMode>
);
Resposta #3
Em vez de:
import ReactDOM from 'react-dom'
ReactDom.render(<h1>Your App</h1>, document.getElementById('root'))
Usar :
import { createRoot } from 'react-dom/client'
createRoot(document.getElementById('root')).render(<h1>Your App</h1>)
Mais detalhes aqui
Resposta #4
Antes
import { render } from 'react-dom';
const container = document.getElementById('app');
render(<App tab="home" />, container);
Depois
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container);
root.render(<App tab="home" />);
Antes, no seu arquivo index.js:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
reportWebVitals();
Altere como abaixo no seu arquivo index.js:
import React from 'react';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { createRoot } from 'react-dom/client';
const container = document.getElementById('root');
const root = createRoot(container);
root.render(<React.StrictMode>
<App />
</React.StrictMode>);
reportWebVitals();
Resposta #5
A API raiz legada com ReactDOM.render foi descontinuada no React 18 e substituída por uma nova API raiz usando createRoot. A raiz do seu app é o elemento DOM de nível superior que contém todos os seus componentes renderizados e geralmente é um <div> com um ID de root.
O React 18 ainda tem suporte para ReactDOM.render, então tecnicamente você não é obrigado a atualizar, mas não é possível saber por quanto tempo esse suporte vai durar.
Você pode encontrar muito mais informações sobre a diferença entre ReactDOM.render e createRoot em https://thelonecoder.dev/javascript/react-js/reactdom-render-vs-createroot/.
Para atualizar para a nova API raiz, altere seu arquivo index.js para algo como o seguinte:
import { createRoot } from 'react-dom/client';
import App from './App';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
