diff --git a/src/content/blog/2022/03/08/react-18-upgrade-guide.md b/src/content/blog/2022/03/08/react-18-upgrade-guide.md
index 29ba0b71d..0dd98c672 100644
--- a/src/content/blog/2022/03/08/react-18-upgrade-guide.md
+++ b/src/content/blog/2022/03/08/react-18-upgrade-guide.md
@@ -1,5 +1,5 @@
---
-title: "How to Upgrade to React 18"
+title: "Cómo actualizar a React 18"
---
March 08, 2022 by [Rick Hanlon](https://twitter.com/rickhanlonii)
@@ -8,79 +8,77 @@ March 08, 2022 by [Rick Hanlon](https://twitter.com/rickhanlonii)
-As we shared in the [release post](/blog/2022/03/29/react-v18), React 18 introduces features powered by our new concurrent renderer, with a gradual adoption strategy for existing applications. In this post, we will guide you through the steps for upgrading to React 18.
+Como compartimos en la publicación de lanzamiento, React 18 introduce características impulsadas por nuestro nuevo renderizador concurrente, con una estrategia de adopción gradual para aplicaciones existentes. En esta publicación, te guiaremos a través de los pasos para actualizar a React 18.
-Please [report any issues](https://github.com/facebook/react/issues/new/choose) you encounter while upgrading to React 18.
+Por favor, informa cualquier problema que encuentres durante la actualización a React 18.
-For React Native users, React 18 will ship in a future version of React Native. This is because React 18 relies on the New React Native Architecture to benefit from the new capabilities presented in this blogpost. For more information, see the [React Conf keynote here](https://www.youtube.com/watch?v=FZ0cG47msEk&t=1530s).
+Para los usuarios de React Native, React 18 se lanzará en una versión futura de React Native. Esto se debe a que React 18 depende de la nueva arquitectura de React Native para beneficiarse de las nuevas capacidades presentadas en esta publicación del blog. Para obtener más información, consulta el discurso principal de React Conf aquí.
----
-
-## Installing {/*installing*/}
+## Instalación {/*installing*/}
-To install the latest version of React:
+Para instalar la última versión de React:
```bash
npm install react react-dom
```
-Or if you’re using yarn:
+O si estás usando yarn:
```bash
yarn add react react-dom
```
-## Updates to Client Rendering APIs {/*updates-to-client-rendering-apis*/}
+## Actualizaciones en las API de renderizado en el cliente {/*updates-to-client-rendering-apis*/}
-When you first install React 18, you will see a warning in the console:
+Cuando instales React 18 por primera vez, verás una advertencia en la consola:
-ReactDOM.render is no longer supported in React 18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React 17. Learn more: https://reactjs.org/link/switch-to-createroot
+ReactDOM.render ya no es compatible en React 18. Usa createRoot en su lugar. Hasta que cambies a la nueva API, tu aplicación se comportará como si estuviera ejecutando React 17. Más información: [enlace](https://reactjs.org/link/switch-to-createroot)
-React 18 introduces a new root API which provides better ergonomics for managing roots. The new root API also enables the new concurrent renderer, which allows you to opt-into concurrent features.
+React 18 introduce una nueva API de raíz que proporciona una mejor ergonomía para administrar las raíces. La nueva API de raíz también habilita el nuevo renderizador concurrente, que te permite optar por las características concurrentes.
```js
-// Before
+// Antes
import { render } from 'react-dom';
const container = document.getElementById('app');
render(, container);
-// After
+// Después
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
-const root = createRoot(container); // createRoot(container!) if you use TypeScript
+const root = createRoot(container); // createRoot(container!) si usas TypeScript
root.render();
```
-We’ve also changed `unmountComponentAtNode` to `root.unmount`:
+También hemos cambiado unmountComponentAtNode a root.unmount:
```js
-// Before
+// Antes
unmountComponentAtNode(container);
-// After
+// Después
root.unmount();
```
-We've also removed the callback from render, since it usually does not have the expected result when using Suspense:
+También hemos eliminado la devolución de llamada de render, ya que generalmente no tiene el resultado esperado cuando se usa Suspense:
```js
-// Before
+// Antes
const container = document.getElementById('app');
render(, container, () => {
console.log('rendered');
});
-// After
+// Después
function AppWithCallbackAfterRender() {
useEffect(() => {
console.log('rendered');
@@ -96,59 +94,63 @@ root.render();
-There is no one-to-one replacement for the old render callback API — it depends on your use case. See the working group post for [Replacing render with createRoot](https://github.com/reactwg/react-18/discussions/5) for more information.
+No hay un reemplazo directo de la antigua API de devolución de llamada de renderización, depende de tu caso de uso. Consulta la publicación del grupo de trabajo para [Reemplazar el renderizado con createRoot](https://github.com/reactwg/react-18/discussions/5) para obtener más información.
-Finally, if your app uses server-side rendering with hydration, upgrade `hydrate` to `hydrateRoot`:
+Finalmente, si tu aplicación utiliza renderizado del lado del servidor con hidratación, actualiza `hydrate` a `hydrateRoot`:
```js
-// Before
+// Antes
import { hydrate } from 'react-dom';
const container = document.getElementById('app');
hydrate(, container);
-// After
+// Después
import { hydrateRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = hydrateRoot(container, );
-// Unlike with createRoot, you don't need a separate root.render() call here.
+// A diferencia de `createRoot`, aquí no necesitas llamar a `root.render()` por separado.
```
-For more information, see the [working group discussion here](https://github.com/reactwg/react-18/discussions/5).
+Para obtener más información, consulta la discusión del grupo de trabajo aquí.
-**If your app doesn't work after upgrading, check whether it's wrapped in ``.** [Strict Mode has gotten stricter in React 18](#updates-to-strict-mode), and not all your components may be resilient to the new checks it adds in development mode. If removing Strict Mode fixes your app, you can remove it during the upgrade, and then add it back (either at the top or for a part of the tree) after you fix the issues that it's pointing out.
+Si tu aplicación deja de funcionar después de la actualización, verifica si está envuelta en ``. Strict Mode se ha vuelto más estricto en React 18, y es posible que no todos tus componentes sean resistentes a las nuevas comprobaciones que agrega en el modo de desarrollo. Si al quitar Strict Mode se soluciona el problema de tu aplicación, puedes eliminarlo durante la actualización y luego agregarlo nuevamente (ya sea en la parte superior o para una parte del árbol) después de corregir los problemas que señala.
-## Updates to Server Rendering APIs {/*updates-to-server-rendering-apis*/}
+## Actualizaciones de las API de Renderizado del Servidor {/*actualizaciones-de-las-api-de-renderizado-del-servidor*/}
+
+En esta versión, estamos renovando nuestras API de `react-dom/server` para admitir por completo Suspense en el servidor y el renderizado de transmisión. Como parte de estos cambios, estamos deprecando la antigua API de transmisión de nodo (`Node streaming API`), que no admite la transmisión incremental de Suspense en el servidor.
+
+El uso de esta API ahora mostrará una advertencia:
+
+`renderToNodeStream`: **Deprecado ⛔️️**
+
+En su lugar, para transmisión en entornos Node, usa:
-In this release, we’re revamping our `react-dom/server` APIs to fully support Suspense on the server and Streaming SSR. As part of these changes, we're deprecating the old Node streaming API, which does not support incremental Suspense streaming on the server.
+`renderToPipeableStream`: **Nuevo ✨**
-Using this API will now warn:
+También estamos introduciendo una nueva API para admitir el renderizado de transmisión con Suspense en entornos de tiempo de ejecución de vanguardia, como Deno y Cloudflare Workers:
-* `renderToNodeStream`: **Deprecated ⛔️️**
+`renderToReadableStream`: **Nuevo ✨**
-Instead, for streaming in Node environments, use:
-* `renderToPipeableStream`: **New ✨**
+Las siguientes API seguirán funcionando, pero con soporte limitado para Suspense:
-We're also introducing a new API to support streaming SSR with Suspense for modern edge runtime environments, such as Deno and Cloudflare workers:
-* `renderToReadableStream`: **New ✨**
+`renderToString`: **Limitado ⚠️**
+`renderToStaticMarkup`: **Limitado ⚠️**
-The following APIs will continue working, but with limited support for Suspense:
-* `renderToString`: **Limited** ⚠️
-* `renderToStaticMarkup`: **Limited** ⚠️
+Finalmente, esta API seguirá funcionando para el renderizado de correos electrónicos:
-Finally, this API will continue to work for rendering e-mails:
-* `renderToStaticNodeStream`
+`renderToStaticNodeStream`
-For more information on the changes to server rendering APIs, see the working group post on [Upgrading to React 18 on the server](https://github.com/reactwg/react-18/discussions/22), a [deep dive on the new Suspense SSR Architecture](https://github.com/reactwg/react-18/discussions/37), and [Shaundai Person’s](https://twitter.com/shaundai) talk on [Streaming Server Rendering with Suspense](https://www.youtube.com/watch?v=pj5N-Khihgc) at React Conf 2021.
+Para obtener más información sobre los cambios en las API de renderizado en el servidor, consulta la publicación del grupo de trabajo sobre [Actualización a React 18 en el servidor](https://github.com/reactwg/react-18/discussions/22), una [inmersión profunda en la nueva arquitectura de Suspense SSR](https://github.com/reactwg/react-18/discussions/37) y la charla de [Shaundai Person](https://twitter.com/shaundai) sobre [Renderizado en el servidor en tiempo real con Suspense](https://www.youtube.com/watch?v=pj5N-Khihgc) en React Conf 2021.
-## Updates to TypeScript definitions {/*updates-to-typescript-definitions*/}
+## Actualizaciones de las Definiciones de TypeScript {/*actualizaciones-de-las-definiciones-de-typescript*/}
-If your project uses TypeScript, you will need to update your `@types/react` and `@types/react-dom` dependencies to the latest versions. The new types are safer and catch issues that used to be ignored by the type checker. The most notable change is that the `children` prop now needs to be listed explicitly when defining props, for example:
+Si tu proyecto utiliza TypeScript, deberás actualizar las dependencias de `@types/react` y `@types/react-dom` a las últimas versiones. Los nuevos tipos son más seguros y detectan problemas que solían ser ignorados por el comprobador de tipos. El cambio más notable es que ahora es necesario listar explícitamente la propiedad `children` al definir props, por ejemplo:
```typescript{3}
interface MyButtonProps {
@@ -157,172 +159,183 @@ interface MyButtonProps {
}
```
-See the [React 18 typings pull request](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56210) for a full list of type-only changes. It links to example fixes in library types so you can see how to adjust your code. You can use the [automated migration script](https://github.com/eps1lon/types-react-codemod) to help port your application code to the new and safer typings faster.
+Consulta la [solicitud de extracción de typings de React 18](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56210) para obtener una lista completa de cambios solo en tipos. Enlaza a ejemplos de correcciones en los tipos de biblioteca para que puedas ver cómo ajustar tu código. Puedes utilizar el [script de migración automatizada](https://github.com/eps1lon/types-react-codemod) para ayudar a adaptar más rápidamente el código de tu aplicación a los nuevos y más seguros typings.
-If you find a bug in the typings, please [file an issue](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/new?category=issues-with-a-types-package) in the DefinitelyTyped repo.
+Si encuentras un error en los typings, por favor [envía un informe](https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/new?category=issues-with-a-types-package) en el repositorio de DefinitelyTyped.
-## Automatic Batching {/*automatic-batching*/}
+## Batching automático {/*automatic-batching*/}
-React 18 adds out-of-the-box performance improvements by doing more batching by default. Batching is when React groups multiple state updates into a single re-render for better performance. Before React 18, we only batched updates inside React event handlers. Updates inside of promises, setTimeout, native event handlers, or any other event were not batched in React by default:
+React 18 agrega mejoras de rendimiento incorporadas realizando más agrupaciones de actualizaciones automáticamente. La agrupación (batching) es cuando React agrupa múltiples actualizaciones de estado en una sola re-renderización para mejorar el rendimiento. Antes de React 18, solo se agrupaban las actualizaciones dentro de los controladores de eventos de React. Las actualizaciones dentro de promesas, setTimeout, controladores de eventos nativos u otros eventos no se agrupaban en React de forma predeterminada:
-```js
-// Before React 18 only React events were batched
+Antes de React 18, solo se agrupaban los eventos de React:
+```js
function handleClick() {
setCount(c => c + 1);
setFlag(f => !f);
- // React will only re-render once at the end (that's batching!)
+ // React solo volverá a renderizar una vez al final (¡eso es agrupación!)
}
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
- // React will render twice, once for each state update (no batching)
+ // React renderizará dos veces, una vez por cada actualización de estado (sin agrupación)
}, 1000);
```
+A partir de React 18 y con `createRoot`, todas las actualizaciones se agruparán automáticamente, sin importar su origen. Esto significa que las actualizaciones dentro de `setTimeout`, promesas, controladores de eventos nativos u otros eventos se agruparán de la misma manera que las actualizaciones dentro de eventos de React:
-Starting in React 18 with `createRoot`, all updates will be automatically batched, no matter where they originate from. This means that updates inside of timeouts, promises, native event handlers or any other event will batch the same way as updates inside of React events:
+Después de React 18, las actualizaciones dentro de `setTimeout`, promesas, controladores de eventos nativos u otros eventos se agrupan:
```js
-// After React 18 updates inside of timeouts, promises,
-// native event handlers or any other event are batched.
-
function handleClick() {
setCount(c => c + 1);
setFlag(f => !f);
- // React will only re-render once at the end (that's batching!)
+ // React solo volverá a renderizar una vez al final (¡eso es agrupación!)
}
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
- // React will only re-render once at the end (that's batching!)
+ // React solo volverá a renderizar una vez al final (¡eso es agrupación!)
}, 1000);
```
-This is a breaking change, but we expect this to result in less work rendering, and therefore better performance in your applications. To opt-out of automatic batching, you can use `flushSync`:
+Este es un cambio que rompe la compatibilidad, pero esperamos que resulte en menos trabajo de renderización y, por lo tanto, en un mejor rendimiento en tus aplicaciones. Si deseas desactivar la agrupación automática, puedes utilizar `flushSync`:
-```js
+```javascript
import { flushSync } from 'react-dom';
function handleClick() {
flushSync(() => {
setCounter(c => c + 1);
});
- // React has updated the DOM by now
+ // React ya ha actualizado el DOM en este punto
flushSync(() => {
setFlag(f => !f);
});
- // React has updated the DOM by now
+ // React ya ha actualizado el DOM en este punto
}
```
-For more information, see the [Automatic batching deep dive](https://github.com/reactwg/react-18/discussions/21).
+Para obtener más información, consulta la [explicación detallada sobre la batching automático](https://github.com/reactwg/react-18/discussions/21).
+
+## Nuevas API para bibliotecas {/*new-apis-for-libraries*/}
-## New APIs for Libraries {/*new-apis-for-libraries*/}
+En el Grupo de Trabajo de React 18, trabajamos con los
-In the React 18 Working Group we worked with library maintainers to create new APIs needed to support concurrent rendering for use cases specific to their use case in areas like styles, and external stores. To support React 18, some libraries may need to switch to one of the following APIs:
+ mantenedores de bibliotecas para crear nuevas API necesarias para admitir la representación concurrente en casos de uso específicos de las bibliotecas, como estilos y almacenes externos. Para admitir React 18, algunas bibliotecas deberán cambiar a una de las siguientes API:
-* `useSyncExternalStore` is a new hook that allows external stores to support concurrent reads by forcing updates to the store to be synchronous. This new API is recommended for any library that integrates with state external to React. For more information, see the [useSyncExternalStore overview post](https://github.com/reactwg/react-18/discussions/70) and [useSyncExternalStore API details](https://github.com/reactwg/react-18/discussions/86).
-* `useInsertionEffect` is a new hook that allows CSS-in-JS libraries to address performance issues of injecting styles in render. Unless you've already built a CSS-in-JS library we don't expect you to ever use this. This hook will run after the DOM is mutated, but before layout effects read the new layout. This solves an issue that already exists in React 17 and below, but is even more important in React 18 because React yields to the browser during concurrent rendering, giving it a chance to recalculate layout. For more information, see the [Library Upgrade Guide for `