From e02f2a1465d8ec16721c59854150949e474bb4b7 Mon Sep 17 00:00:00 2001 From: Juamez Date: Sun, 30 Apr 2023 16:20:31 -0500 Subject: [PATCH 1/4] Translate escape-hatches section --- src/content/learn/escape-hatches.md | 180 ++++++++++++++-------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/src/content/learn/escape-hatches.md b/src/content/learn/escape-hatches.md index 69e733521..1b88619d1 100644 --- a/src/content/learn/escape-hatches.md +++ b/src/content/learn/escape-hatches.md @@ -1,35 +1,35 @@ --- -title: Escape Hatches +title: Puertas de escape --- -Some of your components may need to control and synchronize with systems outside of React. For example, you might need to focus an input using the browser API, play and pause a video player implemented without React, or connect and listen to messages from a remote server. In this chapter, you'll learn the escape hatches that let you "step outside" React and connect to external systems. Most of your application logic and data flow should not rely on these features. +Algunos de tus componentes puede que necesiten controlar y sincronizarse con sistemas externos a react. Por ejemplo, puede que necesites enfocar un input usando la API del navegador, reproducir o pausar un reproductor de video implementado sin React, o conectar y escuchar mensajes de un servidor remoto. En este capitulo, aprenderás las puertas de escape que te permiten “salir” de React y conectarte con sistemas externos. La mayoría de la lógica de tu aplicación y flujo de datos no deberían depender de estas características. -* [How to "remember" information without re-rendering](/learn/referencing-values-with-refs) -* [How to access DOM elements managed by React](/learn/manipulating-the-dom-with-refs) -* [How to synchronize components with external systems](/learn/synchronizing-with-effects) -* [How to remove unnecessary Effects from your components](/learn/you-might-not-need-an-effect) -* [How an Effect's lifecycle is different from a component's](/learn/lifecycle-of-reactive-effects) -* [How to prevent some values from re-triggering Effects](/learn/separating-events-from-effects) -* [How to make your Effect re-run less often](/learn/removing-effect-dependencies) -* [How to share logic between components](/learn/reusing-logic-with-custom-hooks) +* [Como “recordar” información sin volver a renderizar](/learn/referencing-values-with-refs) +* [Como acceder a los elementos del DOM manejados por React](/learn/manipulating-the-dom-with-refs) +* [Como sincronizar componentes con sistemas externos](/learn/synchronizing-with-effects) +* [Como eliminar efectos innecesarios de tus componentes](/learn/you-might-not-need-an-effect) +* [Como el ciclo de vida de un efecto es diferente al de un componente](/learn/lifecycle-of-reactive-effects) +* [Como cuidar algunos valores de efectos desencadenantes](/learn/separating-events-from-effects) +* [Como hacer que tu efecto se vuelva a ejecutar con menos frecuencia](/learn/removing-effect-dependencies) +* [Como compartir lógica entre componentes](/learn/reusing-logic-with-custom-hooks) -## Referencing values with refs {/*referencing-values-with-refs*/} +## Referencia valores con refs {/*referencing-values-with-refs*/} -When you want a component to "remember" some information, but you don't want that information to [trigger new renders](/learn/render-and-commit), you can use a *ref*: +Cuando quieres que un componente "recuerde" cierta información, pero no quieres que esa información [desencadene nuevos renderizados](/learn/render-and-commit), puedes usar una *ref*: ```js const ref = useRef(0); ``` -Like state, refs are retained by React between re-renders. However, setting state re-renders a component. Changing a ref does not! You can access the current value of that ref through the `ref.current` property. +Al igual que un estado, las refs son retenidas por React entre nuevos renderizados. Sin embargo, al asignar el estado se vuelve a renderizar el componente. Cambiar la ref no lo hace!. Puedes acceder al valor actual de esa ref a través de la propiedad `ref.current`. @@ -41,12 +41,12 @@ export default function Counter() { function handleClick() { ref.current = ref.current + 1; - alert('You clicked ' + ref.current + ' times!'); + alert('Has pulsado ' + ref.current + ' veces!'); } return ( ); } @@ -54,17 +54,17 @@ export default function Counter() { -A ref is like a secret pocket of your component that React doesn't track. For example, you can use refs to store [timeout IDs](https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#return_value), [DOM elements](https://developer.mozilla.org/en-US/docs/Web/API/Element), and other objects that don't impact the component's rendering output. +Una ref es como un bolsillo secreto de tu componente que React no puede rastrear. Por ejemplo, puedes usar refs para almacenar [timeout IDs](https://developer.mozilla.org/es/docs/Web/API/setTimeout#valor_devuelto), [DOM elements](https://developer.mozilla.org/en-US/docs/Web/API/Element), y otros objectos que no tienen un impacto en el resultado del renderizado de tu componente. -Read **[Referencing Values with Refs](/learn/referencing-values-with-refs)** to learn how to use refs to remember information. +Lee **[Referenciar Valores con Refs](/learn/referencing-values-with-refs)** para aprender como usar las refs y recordar información. -## Manipulating the DOM with refs {/*manipulating-the-dom-with-refs*/} +## Manipular el DOM con refs {/*manipulating-the-dom-with-refs*/} -React automatically updates the DOM to match your render output, so your components won't often need to manipulate it. However, sometimes you might need access to the DOM elements managed by React—for example, to focus a node, scroll to it, or measure its size and position. There is no built-in way to do those things in React, so you will need a ref to the DOM node. For example, clicking the button will focus the input using a ref: +React automáticamente actualiza el DOM para coincidir con el resultado de tu renderizado, por lo que tus componentes no se necesitarán manipular frecuentemente. Sin embargo, algunas veces puede que necesites acceder a los elementos del DOM gestionados por React—por ejemplo, referenciar un nodo, desplazarse hacia el, o medir su tamaño y posición. No hay una manera integrada de hacer esto en React, así que necesitarás una ref hacia el nodo del DOM. Por ejemplo, al hacer click en el botón se enfocará el input usando una ref: @@ -82,7 +82,7 @@ export default function Form() { <> ); @@ -93,15 +93,15 @@ export default function Form() { -Read **[Manipulating the DOM with Refs](/learn/manipulating-the-dom-with-refs)** to learn how to access DOM elements managed by React. +Lee **[Manipular el DOM con Refs](/learn/manipulating-the-dom-with-refs)** para aprender como acceder a los elementos del DOM manejados por React. -## Synchronizing with Effects {/*synchronizing-with-effects*/} +## Sincronizar con efectos {/*synchronizing-with-effects*/} -Some components need to synchronize with external systems. For example, you might want to control a non-React component based on the React state, set up a server connection, or send an analytics log when a component appears on the screen. Unlike event handlers, which let you handle particular events, *Effects* let you run some code after rendering. Use them to synchronize your component with a system outside of React. +Algunos componentes necesitan sincronizarse con sistemas externos. Por ejemplo, es posible que desees controlar un componente que no sea de React basado en el estado de React, establecer una conexión a un servidor, enviar reporte de analíticas cuando un componente aparece en la pantalla. A diferencia de los manejadores de eventos, que permiten manejar eventos concretos, los *efectos* te permiten ejecutar algún código después de renderizar. Úsalos para sincronizar tu componente con un sistema externo a React. -Press Play/Pause a few times and see how the video player stays synchronized to the `isPlaying` prop value: +Presiona Reproducir/Pausar unas veces y mira como el reproductor de video permanece sincronizado al valor de la prop `isPlaying`: @@ -127,7 +127,7 @@ export default function App() { return ( <> -Many Effects also "clean up" after themselves. For example, an Effect that sets up a connection to a chat server should return a *cleanup function* that tells React how to disconnect your component from that server: +Algunos efectos pueden "limpiarse" por sí mismos. Por ejemplo, un efecto que establece una conexión a un servidor de chat debería retornar una *función de limpieza* que le dice a React como desconectar su componente de ese servidor: @@ -159,19 +159,19 @@ export default function ChatRoom() { connection.connect(); return () => connection.disconnect(); }, []); - return

Welcome to the chat!

; + return

Bienvenido al chat!

; } ``` ```js chat.js export function createConnection() { - // A real implementation would actually connect to the server + // Una aplicación real se conectaría al servidor return { connect() { - console.log('✅ Connecting...'); + console.log('✅ Conectando...'); }, disconnect() { - console.log('❌ Disconnected.'); + console.log('❌ Desconectado.'); } }; } @@ -183,30 +183,30 @@ input { display: block; margin-bottom: 20px; }
-In development, React will immediately run and clean up your Effect one extra time. This is why you see `"✅ Connecting..."` printed twice. This ensures that you don't forget to implement the cleanup function. +En desarrollo, React ejecutará inmediatamente y limpiará tu efecto una vez más. Es por esto que ves "✅ Conectando..."` impreso dos veces. Esto asegura que no olvides de aplicar la función de limpieza. -Read **[Synchronizing with Effects](/learn/synchronizing-with-effects)** to learn how to synchronize components with external systems. +Lee **[Sincronizar con Efectos](/learn/synchronizing-with-effects)** para aprender a como sincronizar componentes con sistemas externos. -## You Might Not Need An Effect {/*you-might-not-need-an-effect*/} +## Puede que no necesites un efecto {/*you-might-not-need-an-effect*/} -Effects are an escape hatch from the React paradigm. They let you "step outside" of React and synchronize your components with some external system. If there is no external system involved (for example, if you want to update a component's state when some props or state change), you shouldn't need an Effect. Removing unnecessary Effects will make your code easier to follow, faster to run, and less error-prone. +Los efectos son una puerta de escape del paradigma de React. Te permiten "salir" de React y sincronizar tus componentes con algún sistema externo. Si no hay un sistema externo involucrado (por ejemplo, si quieres actualizar el estado de un componente cuando cambien algunas props o estados), no deberías necesitar un efecto. La eliminación de efectos innecesarios harán tu código más fácil de comprender, más rápido de ejecutar y menos propenso a errores. -There are two common cases in which you don't need Effects: -- **You don't need Effects to transform data for rendering.** -- **You don't need Effects to handle user events.** +Hay dos casos comunes en los que no necesitas efectos: +- **No necesitas efectos para transformar los datos para el renderizado.** +- **No necesitas efectos para manejar eventos de usuario.** -For example, you don't need an Effect to adjust some state based on other state: +Por ejemplo, no necesitas un efecto para ajustar algún estado basado en otro estado: ```js {5-9} function Form() { const [firstName, setFirstName] = useState('Taylor'); const [lastName, setLastName] = useState('Swift'); - // 🔴 Avoid: redundant state and unnecessary Effect + // 🔴 Evita: estado redundante y efecto innecesario const [fullName, setFullName] = useState(''); useEffect(() => { setFullName(firstName + ' ' + lastName); @@ -215,31 +215,31 @@ function Form() { } ``` -Instead, calculate as much as you can while rendering: +En lugar a eso, calcula todo lo que puedas mientras renderizas: ```js {4-5} function Form() { const [firstName, setFirstName] = useState('Taylor'); const [lastName, setLastName] = useState('Swift'); - // ✅ Good: calculated during rendering + // ✅ Bien: calculado durante el renderizado const fullName = firstName + ' ' + lastName; // ... } ``` -However, you *do* need Effects to synchronize with external systems. +Sin embargo, *necesitas* efectos para sincronizar con sistemas externos. -Read **[You Might Not Need an Effect](/learn/you-might-not-need-an-effect)** to learn how to remove unnecessary Effects. +Lee **[Puede que no necesites de un efecto](/learn/you-might-not-need-an-effect)** para aprender como eliminar efectos innecesarios. -## Lifecycle of reactive effects {/*lifecycle-of-reactive-effects*/} +## Ciclo de vida de los efectos reactivos {/*lifecycle-of-reactive-effects*/} -Effects have a different lifecycle from components. Components may mount, update, or unmount. An Effect can only do two things: to start synchronizing something, and later to stop synchronizing it. This cycle can happen multiple times if your Effect depends on props and state that change over time. +Los efectos tienen un ciclo de vida diferente al de los componentes. Los componentes se pueden montar, actualizar, o desmontar. Un efecto puede únicamente hacer dos cosas: empezar a sincronizar algo, y a detener ese sincronizado más adelante. Este ciclo puede suceder varias veces si tu efecto depende de props y estados que pueden cambiar sobre el tiempo. -This Effect depends on the value of the `roomId` prop. Props are *reactive values,* which means they can change on a re-render. Notice that the Effect *re-synchronizes* (and re-connects to the server) if `roomId` changes: +Este efecto depende del valor de la prop `roomId`. Las props son *valores reactivos,* que significan que pueden cambiar al volver a renderizar. Observa que el efecto *se vuelve a sincronizar* (y se vuelve a conectar al servidor) si `roomId` cambia: @@ -256,7 +256,7 @@ function ChatRoom({ roomId }) { return () => connection.disconnect(); }, [roomId]); - return

Welcome to the {roomId} room!

; + return

Bienvenido a la sala {roomId}!

; } export default function App() { @@ -264,7 +264,7 @@ export default function App() { return ( <>
-This is not ideal. You want to re-connect to the chat only if the `roomId` has changed. Switching the `theme` shouldn't re-connect to the chat! Move the code reading `theme` out of your Effect into an *Effect Event*: +Esto no es lo ideal. Quieres volver a conectar con el chat únicamente si el `roomId` ha cambiado. Cambiar el `tema` no debería volver a conectarse con el chat! Mueve el código que lee el `tema` fuera de tu efecto hacia un *evento de efecto*: @@ -479,7 +479,7 @@ const serverUrl = 'https://localhost:1234'; function ChatRoom({ roomId, theme }) { const onConnected = useEffectEvent(() => { - showNotification('Connected!', theme); + showNotification('Conectado!', theme); }); useEffect(() => { @@ -491,7 +491,7 @@ function ChatRoom({ roomId, theme }) { return () => connection.disconnect(); }, [roomId]); - return

Welcome to the {roomId} room!

+ return

Bienvenido a la sala {roomId}!

} export default function App() { @@ -500,7 +500,7 @@ export default function App() { return ( <>
-No quieres que el chat se vuelva a conectar cada vez que empieces a escribir un mensaje. Para resolver este problema, mueve el objecto `options` dentro del efecto así solo depende únicamente del string `roomId`: +No quieres que el chat se vuelva a conectar cada vez que empieces a escribir un mensaje. Para resolver este problema, mueve el objeto `options` dentro del Efecto así solo depende únicamente del string `roomId`: @@ -693,7 +693,7 @@ function ChatRoom({ roomId }) { return ( <> -

Bienvenido a la sala {roomId}!

+

¡Bienvenido a la sala {roomId}!

setMessage(e.target.value)} /> ); @@ -742,19 +742,19 @@ button { margin-left: 10px; }
-Fíjate que no empezaste editando la lista de dependencia para eliminar la dependencia `options`. Eso sería un error. En lugar de eso, cambiaste el código alrededor así que la dependencia se volvió *innecesaria.* Piensa en la lista de dependencias como una lista de todos los valores reactivos utilizados por el código de tu efecto. Tú no escogiste intencionadamente que poner en esa lista. La lista describe tu código. Para cambiar la lista de dependencias, cambia el código. +Fíjate que no empezaste editando la lista de dependencias para eliminar la dependencia `options`. Eso sería un error. En lugar de eso, cambiaste el código alrededor, así que la dependencia se volvió *innecesaria.* Piensa en la lista de dependencias como una lista de todos los valores reactivos utilizados por el código de tu Efecto. Tú no escogiste intencionadamente que poner en esa lista. La lista describe tu código. Para cambiar la lista de dependencias, cambia el código. -Lee **[Eliminar dependencias de efectos](/learn/removing-effect-dependencies)** para aprender a hacer que tu efecto se repita con menos frecuencia. +Lee **[Eliminar dependencias de Efectos](/learn/removing-effect-dependencies)** para aprender a hacer que tu Efecto se repita con menos frecuencia. -## Reutilizar la lógica con hooks personalizados {/*reusing-logic-with-custom-hooks*/} +## Reutilizar la lógica con hooks integrados {/*reusing-logic-with-custom-hooks*/} -React viene con hooks incorporados como `useState`, `useContext`, y `useEffect`. Algunas veces, desearás que existiera un hook para un propósito especifico: por ejemplo, para llamar datos, para saber si el usuario esta conectado, o para conectarse a una sala de chat. Para realizar esto, puedes crear tus propios hooks de acuerdo a las necesidades de tu aplicación. +React viene con Hooks integrados como `useState`, `useContext`, y `useEffect`. Algunas veces, desearás que existiera un Hook para un propósito específico: por ejemplo, para llamar datos, para saber si el usuario está conectado, o para conectarse a una sala de chat. Para realizar esto, puedes crear tus propios Hooks de acuerdo a las necesidades de tu aplicación. -En este ejemplo, el hook personalizado `usePointerPosition` rastrea la posición del cursor, mientras que el hook personalizado `useDelayedValue` retorna un valor que esta "rezagado" con respecto al valor que le pasaste por un cierto número de milisegundos. Mueve el cursor sobre el área de vista previa del sandbox para ver un rastro de puntos en movimiento que siguen al cursor: +En este ejemplo, el Hook integrado `usePointerPosition` rastrea la posición del cursor, mientras que el Hook integrado `useDelayedValue` devuelve un valor que está "rezagado" con respecto al valor que le pasaste por un cierto número de milisegundos. Mueve el cursor sobre el área de vista previa del sandbox para ver un rastro de puntos en movimiento que siguen al cursor: @@ -835,14 +835,14 @@ body { min-height: 300px; } -Puedes crear hooks personalizados, componerlos juntos, pasar datos entre ellos y reutilizarlos entre componentes. A medida que tu aplicación crezca, escribirás menos efectos a mano porque podrás reutilizar los hooks personalizados que ya hayas escrito. También existen excelentes hooks personalizados mantenidos por la comunidad de React. +Puedes crear Hooks integrados, componerlos juntos, pasar datos entre ellos y reutilizarlos entre componentes. A medida que tu aplicación crezca, escribirás menos Efectos a mano porque podrás reutilizar los Hooks integrados que ya hayas escrito. También existen excelentes Hooks integrados mantenidos por la comunidad de React. -Lee **[Reutilizar la lógica con hooks personalizados](/learn/reusing-logic-with-custom-hooks)** para aprender como compartir lógica entre componentes. +Lee **[Reutilizar la lógica con Hooks integrados](/learn/reusing-logic-with-custom-hooks)** para aprender como compartir lógica entre componentes. ## Qué sigue? {/*whats-next*/} -Dirígete a [Referenciar valores con refs](/learn/referencing-values-with-refs) para empezar a leer este capítulo! +¡Dirígete a [Referenciar valores con Refs](/learn/referencing-values-with-refs) para empezar a leer este capítulo! From 0aa08c4b6fe8263c0af87b1830b18b99a7f85cae Mon Sep 17 00:00:00 2001 From: Rainer Martinez Date: Fri, 5 May 2023 23:55:55 -0400 Subject: [PATCH 4/4] fix capitalization --- src/content/learn/escape-hatches.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/learn/escape-hatches.md b/src/content/learn/escape-hatches.md index 381bee0f4..5b18247a3 100644 --- a/src/content/learn/escape-hatches.md +++ b/src/content/learn/escape-hatches.md @@ -23,13 +23,13 @@ Algunos de tus componentes puede que necesiten controlar y sincronizarse con sis ## Referencia valores con refs {/*referencing-values-with-refs*/} -Cuando quieres que un componente "recuerde" cierta información, pero no quieres que esa información [desencadene nuevos renderizados](/learn/render-and-commit), puedes usar una *Ref*: +Cuando quieres que un componente "recuerde" cierta información, pero no quieres que esa información [desencadene nuevos renderizados](/learn/render-and-commit), puedes usar una *ref*: ```js const ref = useRef(0); ``` -Al igual que un estado, las Refs son retenidas por React entre nuevos renderizados. Sin embargo, al asignar un nuevo valor al estado se vuelve a renderizar el componente. ¡Cambiar el valor de la Ref no lo hace! Puedes acceder al valor actual de esa Ref a través de la propiedad `ref.current`. +Al igual que un estado, las refs son retenidas por React entre nuevos renderizados. Sin embargo, al asignar un nuevo valor al estado se vuelve a renderizar el componente. ¡Cambiar el valor de la ref no lo hace! Puedes acceder al valor actual de esa ref a través de la propiedad `ref.current`. @@ -54,17 +54,17 @@ export default function Counter() { -Una Ref es como un bolsillo secreto de tu componente que React no puede rastrear. Por ejemplo, puedes usar Refs para almacenar [timeout IDs](https://developer.mozilla.org/es/docs/Web/API/setTimeout#valor_devuelto), [DOM elements](https://developer.mozilla.org/en-US/docs/Web/API/Element), y otros objetos que no tienen un impacto en el resultado del renderizado de tu componente. +Una ref es como un bolsillo secreto de tu componente que React no puede rastrear. Por ejemplo, puedes usar refs para almacenar [timeout IDs](https://developer.mozilla.org/es/docs/Web/API/setTimeout#valor_devuelto), [DOM elements](https://developer.mozilla.org/en-US/docs/Web/API/Element), y otros objetos que no tienen un impacto en el resultado del renderizado de tu componente. -Lee **[Referenciar valores con Refs](/learn/referencing-values-with-refs)** para aprender como usar las Refs y recordar información. +Lee **[Referenciar valores con refs](/learn/referencing-values-with-refs)** para aprender como usar las refs y recordar información. ## Manipular el DOM con refs {/*manipulating-the-dom-with-refs*/} -React automáticamente actualiza el DOM para coincidir con el resultado de tu renderizado, por lo que tus componentes no se necesitarán manipular frecuentemente. Sin embargo, algunas veces puede que necesites acceder a los elementos del DOM gestionados por React—por ejemplo, referenciar un nodo, desplazarse hacia él, o medir su tamaño y posición. No hay una manera integrada de hacer esto en React, así que necesitarás una Ref hacia el nodo del DOM. Por ejemplo, al hacer clic en el botón se enfocará el input usando una Ref: +React automáticamente actualiza el DOM para coincidir con el resultado de tu renderizado, por lo que tus componentes no se necesitarán manipular frecuentemente. Sin embargo, algunas veces puede que necesites acceder a los elementos del DOM gestionados por React—por ejemplo, referenciar un nodo, desplazarse hacia él, o medir su tamaño y posición. No hay una manera integrada de hacer esto en React, así que necesitarás una ref hacia el nodo del DOM. Por ejemplo, al hacer clic en el botón se enfocará el input usando una ref: @@ -93,7 +93,7 @@ export default function Form() { -Lee **[Manipular el DOM con Refs](/learn/manipulating-the-dom-with-refs)** para aprender como acceder a los elementos del DOM manejados por React. +Lee **[Manipular el DOM con refs](/learn/manipulating-the-dom-with-refs)** para aprender como acceder a los elementos del DOM manejados por React. @@ -191,7 +191,7 @@ Lee **[Sincronizar con Efectos](/learn/synchronizing-with-effects)** para aprend -## Puede que no necesites un efecto {/*you-might-not-need-an-effect*/} +## Puede que no necesites un Efecto {/*you-might-not-need-an-effect*/} Los Efectos son una puerta de escape del paradigma de React. Te permiten "salir" de React y sincronizar tus componentes con algún sistema externo. Si no hay un sistema externo involucrado (por ejemplo, si quieres actualizar el estado de un componente cuando cambien algunas props o estados), no deberías necesitar un Efecto. La eliminación de Efectos innecesarios harán tu código más fácil de comprender, más rápido de ejecutar y menos propenso a errores. @@ -231,7 +231,7 @@ Sin embargo, *necesitas* Efectos para sincronizar con sistemas externos. -Lee **[Puede que no necesites de un Efecto](/learn/you-might-not-need-an-effect)** para aprender como eliminar Efectos innecesarios. +Lee **[Puede que no necesites un Efecto](/learn/you-might-not-need-an-effect)** para aprender como eliminar Efectos innecesarios. @@ -845,4 +845,4 @@ Lee **[Reutilizar la lógica con Hooks integrados](/learn/reusing-logic-with-cus ## Qué sigue? {/*whats-next*/} -¡Dirígete a [Referenciar valores con Refs](/learn/referencing-values-with-refs) para empezar a leer este capítulo! +¡Dirígete a [Referenciar valores con refs](/learn/referencing-values-with-refs) para empezar a leer este capítulo!