Skip to content

Commit a3e2a78

Browse files
committed
Merge branch 'source' into patch-1
2 parents fbda908 + b82b7e6 commit a3e2a78

File tree

8 files changed

+45
-39
lines changed

8 files changed

+45
-39
lines changed

src/content/0/es/part0a.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ Al enviar al menos 24 de 29 ejercicios de la parte 9 del curso, TypeScript, pued
140140
141141
#### Part 10 - Desarrollo Web Full Stack: React Native (2 crédito, CSM14111)
142142
143-
Al enviar ejercicios 25 ejercicios para la parte 10 del curso, React Native, puedes obtener dos créditos adicionales. Puedes encontrar más información sobre los requisitos previos de esta parte, el envío de ejercicios y los créditos en la [parte 10](/es/part10/introduccion_a_react_native).
143+
Al enviar 25 ejercicios para la parte 10 del curso, React Native, puedes obtener dos créditos adicionales. Puedes encontrar más información sobre los requisitos previos de esta parte, el envío de ejercicios y los créditos en la [parte 10](/es/part10/introduccion_a_react_native).
144144
145145
- Envía al menos 25 ejercicios para la parte 10.
146146
- [Inscríbete en la parte 10 a través de la Open University](https://www.avoin.helsinki.fi/palvelut/esittely.aspx?s=otm-ec172afe-bc01-46ab-af23-694311f1950a).

src/content/1/es/part1c.md

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
---
1+
---
22
mainImage: ../../../images/part-1.svg
33
part: 1
44
letter: c
55
lang: es
6-
---
6+
---
77

8-
<div class="content">
8+
<div class="content">
99

1010
Volvamos a trabajar con React.
1111

@@ -212,7 +212,7 @@ El componente de la aplicación recibe el valor del contador a través de la pro
212212
counter += 1
213213
```
214214
215-
el componente no volverá a renderizarse. Podemos hacer que el componente se vuelva a renderizar llamando al método _ReactDOM.render_ por segunda vez, por ejemplo, de la siguiente manera:
215+
el componente no volverá a renderizarse. Podemos hacer que el componente se vuelva a renderizar llamando al método _ReactDOM.render_ por segunda vez, por ejemplo, de la siguiente manera:
216216
217217
```js
218218
let counter = 1
@@ -230,7 +230,7 @@ counter += 1
230230
refresh()
231231
```
232232
233-
El comando de re-renderizado se ha envuelto dentro de la función _refresh_ para reducir la cantidad de código copiado y pegado.
233+
El comando de re-renderizado se ha envuelto dentro de la función _refresh_ para reducir la cantidad de código copiado y pegado.
234234
235235
Ahora el componente <i>se renderiza tres veces</i>, primero con el valor 1, luego 2 y finalmente 3. Sin embargo, los valores 1 y 2 se muestran en la pantalla durante un período de tiempo tan corto que pueden no ser notados.
236236
@@ -249,9 +249,9 @@ Hacer llamadas repetidas al método _ReactDOM.render_ no es la forma recomendada
249249
250250
Todos nuestros componentes hasta ahora han sido simples en el sentido de que no contienen ningún estado que pueda cambiar durante el ciclo de vida del componente.
251251
252-
A continuación, agregaremos estado al componente <i>App</i> con la ayuda del [hook de estado](https://es.legacy.reactjs.org/docs/hooks-state.html) de React.
252+
A continuación, agreguemos estado al componente <i>App</i> de nuestra aplicación con la ayuda del [hook de estado](https://es.react.dev/reference/react/useState) de React.
253253
254-
Cambiaremos la aplicación a lo siguiente. <i>main.jsx</i> regresa a
254+
Cambiaremos la aplicación a lo siguiente:
255255
256256
```js
257257
import ReactDOM from 'react-dom/client'
@@ -364,7 +364,7 @@ Es fácil de seguir y rastrear las llamadas realizadas a la <i>App</i> función
364364
365365
![](../../images/1/4e.png)
366366
367-
### Manejo de eventos
367+
### Manejo de eventos
368368
369369
Ya hemos mencionado <i>controladores de eventos</i> algunas veces en la [parte 0](/es/part0), que están registrados para ser llamados cuando ocurren eventos específicos. Por ejemplo, la interacción de un usuario con los diferentes elementos de una página web puede provocar que se active una colección de diferentes tipos de eventos.
370370
@@ -441,7 +441,7 @@ const App = () => {
441441
plus
442442
</button>
443443
// highlight-start
444-
<button onClick={() => setCounter(0)}>
444+
<button onClick={() => setCounter(0)}>
445445
zero
446446
</button>
447447
// highlight-end
@@ -462,50 +462,50 @@ Definimos los controladores de eventos para nuestros botones donde declaramos su
462462
</button>
463463
```
464464
465-
¿Qué pasaría si intentáramos definir los controladores de eventos de una forma más simple?
465+
¿Qué pasaría si intentáramos definir los controladores de eventos de una forma más simple?
466466
467467
```js
468-
<button onClick={setCounter(counter + 1)}>
468+
<button onClick={setCounter(counter + 1)}>
469469
plus
470470
</button>
471471
```
472472
473473
Esto rompería completamente nuestra aplicación:
474474
475475
![Captura de pantalla de un error de re-renderizado](../../images/1/5b.png)
476-
476+
477477
¿Qué está pasando? Se supone que un controlador de eventos es una <i>función</i> o una <i>referencia de función</i>, y cuando escribimos
478478
479479
```js
480480
<button onClick={setCounter(counter + 1)}>
481481
```
482482
483-
el controlador de eventos es en realidad una <i>llamada a la función</i>. En muchas situaciones esto está bien, pero no en esta situación particular. Al principio, el valor de la variable <i>counter</i> es 0. Cuando React renderiza el componente por primera vez, ejecuta la llamada de función <em>setCounter(0 + 1)</em> y cambia el valor del estado del componente en 1.
483+
el controlador de eventos es en realidad una <i>llamada a la función</i>. En muchas situaciones esto está bien, pero no en esta situación particular. Al principio, el valor de la variable <i>counter</i> es 0. Cuando React renderiza el componente por primera vez, ejecuta la llamada de función <em>setCounter(0 + 1)</em> y cambia el valor del estado del componente en 1.
484484
Esto hará que el componente se vuelva a renderizar, react ejecutará la llamada a la función setCounter nuevamente, y el estado cambiará dando lugar a otra repetición...
485485
486486
Definamos los controladores de eventos como lo hicimos antes
487487
488488
```js
489-
<button onClick={() => setCounter(counter + 1)}>
489+
<button onClick={() => setCounter(counter + 1)}>
490490
plus
491491
</button>
492492
```
493493
494-
Ahora el atributo del botón que define lo que sucede cuando se hace clic en el botón - <i>onClick</i> - tiene el valor _() => setCounter (counter + 1)_.
495-
La función setCounter se llama solo cuando un usuario hace clic en el botón.
494+
Ahora el atributo del botón que define lo que sucede cuando se hace clic en el botón - <i>onClick</i> - tiene el valor _() => setCounter (counter + 1)_.
495+
La función setCounter se llama solo cuando un usuario hace clic en el botón.
496496
497497
Por lo general, definir controladores de eventos dentro de las plantillas JSX no es una buena idea.
498498
Aquí está bien, porque nuestros controladores de eventos son muy simples.
499499
500-
Vamos a separar a los controladores de eventos en funciones separadas de todas formas:
500+
Vamos a separar a los controladores de eventos en funciones separadas de todas formas:
501501
502502
```js
503503
const App = () => {
504504
const [ counter, setCounter ] = useState(0)
505505

506506
// highlight-start
507507
const increaseByOne = () => setCounter(counter + 1)
508-
508+
509509
const setToZero = () => setCounter(0)
510510
// highlight-end
511511

@@ -525,7 +525,7 @@ const App = () => {
525525
Aquí los controladores de eventos se han definido correctamente. El valor del atributo <i>onClick</i> es una variable que contiene una referencia a una función:
526526
527527
```js
528-
<button onClick={increaseByOne}>
528+
<button onClick={increaseByOne}>
529529
plus
530530
</button>
531531
```
@@ -534,11 +534,11 @@ Aquí los controladores de eventos se han definido correctamente. El valor del a
534534
535535
Se recomienda escribir componentes de React que sean pequeños y reutilizables en toda la aplicación e incluso en proyectos. Refactoricemos nuestra aplicación para que esté compuesta por tres componentes más pequeños, un componente para mostrar el contador y dos componentes para los botones.
536536
537-
Primero implementemos un componente <i>Display</i> que es responsable de mostrar el valor del contador.
537+
Primero implementemos un componente <i>Display</i> que es responsable de mostrar el valor del contador.
538538
539539
Una de las mejores prácticas en React es [levantar el estado](https://es.legacy.reactjs.org/docs/lifting-state-up.html) en la jerarquía de componentes. La documentación dice:
540540
541-
> <i>A menudo, varios componentes deben reflejar los mismos datos cambiantes. Recomendamos elevar el estado compartido a su ancestro común más cercano.</i>
541+
> <i>A menudo, varios componentes deben reflejar los mismos datos cambiantes. Recomendamos elevar el estado compartido a su ancestro común más cercano.</i>
542542
543543
Así que coloquemos el estado de la aplicación en el componente <i>App</i> y pasémoslo al componente <i>Display</i> a través de <i>props</i>:
544544
@@ -550,7 +550,7 @@ const Display = (props) => {
550550
}
551551
```
552552
553-
Usar el componente es sencillo, ya que solo necesitamos pasarle el estado del _counter_:
553+
Usar el componente es sencillo, ya que solo necesitamos pasarle el estado del _counter_:
554554
555555
```js
556556
const App = () => {
@@ -565,7 +565,7 @@ const App = () => {
565565
<button onClick={increaseByOne}>
566566
plus
567567
</button>
568-
<button onClick={setToZero}>
568+
<button onClick={setToZero}>
569569
zero
570570
</button>
571571
</div>
@@ -608,11 +608,11 @@ const App = () => {
608608
<Button
609609
handleClick={setToZero}
610610
text='zero'
611-
/>
611+
/>
612612
<Button
613613
handleClick={decreaseByOne}
614614
text='minus'
615-
/>
615+
/>
616616
// highlight-end
617617
</div>
618618
)
@@ -627,10 +627,10 @@ El controlador de eventos se pasa al componente <i>Button</i> a través de la pr
627627
628628
Repasemos los principios fundamentales de cómo funciona una aplicación una vez más.
629629
630-
Cuando se inicia la aplicación, se ejecuta el código en _App_. Este código usa un hook [useState](https://es.legacy.reactjs.org/docs/hooks-reference.html#usestate) para crear el estado de la aplicación, estableciendo un valor inicial de la variable _counter_.
631-
Este componente contiene el componente _Display_, que muestra el valor del contador, 0 y tres componentes _Button_. Todos los botones tienen controladores de eventos, que se utilizan para cambiar el estado del contador.
630+
Cuando se inicia la aplicación, se ejecuta el código en _App_. Este código usa un hook [useState](https://es.react.dev/reference/react/useState) para crear el estado de la aplicación, estableciendo un valor inicial de la variable _counter_.
631+
Este componente contiene el componente _Display_, que muestra el valor del contador, 0, y tres componentes _Button_. Todos los botones tienen controladores de eventos, que se utilizan para cambiar el estado del contador.
632632
633-
Cuando se hace clic en uno de los botones, se ejecuta el controlador de eventos. El controlador de eventos cambia el estado del componente _App_ con la función _setCounter_.
633+
Cuando se hace clic en uno de los botones, se ejecuta el controlador de eventos. El controlador de eventos cambia el estado del componente _App_ con la función _setCounter_.
634634
**Llamar a una función que cambia el estado hace que el componente se vuelva a procesar.**
635635
636636
Entonces, si un usuario hace clic en el botón <i>plus</i>, el controlador de eventos del botón cambia el valor de _counter_ a 1, y el componente _App_ se vuelve a generar.
@@ -667,7 +667,7 @@ const App = () => {
667667
<Button onClick={decreaseByOne} text="minus" />
668668
</div>
669669
)
670-
}
670+
}
671671
```
672672
673673
Dejanos ahora ver que se imprime en la consola cuando se hace clic en los botones plus, zero y minus:

src/content/1/es/part1d.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ const handleRightClick = () => {
126126
}
127127
```
128128

129-
La sintaxis puede parecer un poco extraña al principio. En la práctica, <em>{...clicks}</em> crea un nuevo objeto que tiene copias de todas las propiedades del objeto _clicks_. Cuando especificamos una propiedad en particular, por ejemplo, <i>right</i> en <em>{...clics, right: 1}</em>, el valor de la propiedad _right_ en el nuevo objeto será 1.
129+
La sintaxis puede parecer un poco extraña al principio. En la práctica, <em>{...clicks}</em> crea un nuevo objeto que tiene copias de todas las propiedades del objeto _clicks_. Cuando especificamos una propiedad en particular, por ejemplo, <i>right</i> en <em>{...clicks, right: 1}</em>, el valor de la propiedad _right_ en el nuevo objeto será 1.
130130

131131
En el ejemplo anterior, esto:
132132

src/content/3/en/part3c.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ Let's get a quick start by copy-pasting the Mongoose definitions to the <i>index
371371
```js
372372
const mongoose = require('mongoose')
373373

374+
const password = process.argv[2]
375+
374376
// DO NOT SAVE YOUR PASSWORD TO GITHUB!!
375377
const url =
376378
`mongodb+srv://fullstack:${password}@cluster0.o1opl.mongodb.net/?retryWrites=true&w=majority`

src/content/5/en/part5c.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ test('renders content', () => {
186186
})
187187
```
188188

189-
**NB:** A better method of selecting elements for testing, is setting id-attributes that are inserted into the code specifically for testing purposes. We can then use a selector like [getByTestId](https://testing-library.com/docs/queries/bytestid/), that looks for elements based on the specified id-attribute (named `data-testid` in this case).
189+
**NB:** A more consistent way of selecting elements is using a [data attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*) that is specifically defined for testing purposes. Using _react-testing-library_, we can leverage the [getByTestId](https://testing-library.com/docs/queries/bytestid/) method to select elements with a specified _data-testid_ attribute.
190190

191191
### Debugging tests
192192

src/content/6/en/part6d.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,11 @@ const App = () => {
266266
},
267267
})
268268

269+
// highlight-start
269270
const toggleImportance = (note) => {
270271
updateNoteMutation.mutate({...note, important: !note.important })
271272
}
273+
// highlight-end
272274

273275
// ...
274276
}
@@ -363,7 +365,7 @@ Most React applications need not only a way to temporarily store the served data
363365

364366
### Exercises 6.20.-6.22.
365367

366-
Now let's make a new version of the anecdote application that uses the React Query library. Take [this project](https://github.com/fullstack-hy2020/query-anecdotes) as your starting point. The project has a ready-installed JSON Server, the operation of which has been slightly modified. Start the server with <i>npm run server</i>.
368+
Now let's make a new version of the anecdote application that uses the React Query library. Take [this project](https://github.com/fullstack-hy2020/query-anecdotes) as your starting point. The project has a ready-installed JSON Server, the operation of which has been slightly modified (Review the _server.js_ file for more details. Make sure you're connecting to the correct _PORT_). Start the server with <i>npm run server</i>.
367369

368370
#### Exercise 6.20
369371

src/content/6/es/part6b.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,9 +413,9 @@ Hay un pequeño defecto cosmético en nuestra aplicación. Aunque el filtro est
413413
414414
#### 6.9 Mejores anécdotas, paso 7
415415
416-
Implementa filtros para las anecdotas que se muestran al usuario. Se recomienda crear un nuevo reducer, action creators y un reducer commbinado para la store usando la función <i>combineReducers</i>.
416+
Implementa filtros para las anécdotas que se muestran al usuario. Se recomienda crear un nuevo reducer, action creators y un reducer combinado para la store usando la función <i>combineReducers</i>.
417417
418-
Crea un nuevo componente <i>Filter</i> para mostrar los filtros. Puedes utilizar el suigiente código como punto de partida:
418+
Crea un nuevo componente <i>Filter</i> para mostrar los filtros. Puedes utilizar el siguiente código como punto de partida:
419419
420420
```js
421421
const Filter = () => {
@@ -716,11 +716,11 @@ Continuemos trabajando en la aplicación de anécdotas que comenzamos en el ejer
716716
717717
#### 6.10 Mejores anécdotas, paso 8
718718
719-
Instale Redux Toolkit en el proyecto. Mueva la creacion de la store de redux a su propio archivo <i>store.js</i> y use la función <em>configureStore</em> para crear la store.
719+
Instale Redux Toolkit en el proyecto. Mueva la creación de la store de redux a su propio archivo <i>store.js</i> y use la función <em>configureStore</em> para crear la store.
720720
721721
Cambie la definición del <i>Filter reducer y creación de acciones</i> para usar la función <em>createSlice</em> de Redux Toolkit.
722722
723-
Tambien, empiece a usar los Redux DevTools para depurar el estado de la aplicación facilmente.
723+
También, empiece a usar los Redux DevTools para depurar el estado de la aplicación fácilmente.
724724
725725
#### 6.11 Mejores anécdotas, paso 9
726726

src/content/6/es/part6d.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ newNoteMutation.mutate({ content, important: true })
205205

206206
Nuestra solución es buena. Excepto que no funciona. La nueva nota se guarda en el servidor, pero no se actualiza en la pantalla.
207207

208-
Para renderizar una nueva nota, debemos decirle a React Query que el resultado antiguo de la consulta cuya clave es el sring <i>notes</i> debe ser [invalidado](https://react-query-v3.tanstack.com/guides/invalidations-from-mutations).
208+
Para renderizar una nueva nota, debemos decirle a React Query que el resultado antiguo de la consulta cuya clave es el string <i>notes</i> debe ser [invalidado](https://react-query-v3.tanstack.com/guides/invalidations-from-mutations).
209209

210210
Afortunadamente, la invalidación es fácil, se puede hacer definiendo la función de devolución de llamada <i>onSuccess</i> apropiada para la mutación:
211211

@@ -256,9 +256,11 @@ const App = () => {
256256
},
257257
})
258258

259+
// highlight-start
259260
const toggleImportance = (note) => {
260261
updateNoteMutation.mutate({...note, important: !note.important })
261262
}
263+
// highlight-end
262264

263265
// ...
264266
}
@@ -359,7 +361,7 @@ La aplicación debe funcionar de tal manera que si hay problemas para comunicars
359361

360362
![](../../images/6/65new.png)
361363

362-
Puede encontra [aquí](https://react-query-v3.tanstack.com/guides/queries) información sobre cómo detectar posibles errores.
364+
Puede encontrar [aquí](https://react-query-v3.tanstack.com/guides/queries) información sobre cómo detectar posibles errores.
363365

364366
Puede simular un problema con el servidor apagando el servidor JSON. Tenga en cuenta que en una situación problemática, la consulta primero está en el estado <i>isLoading</i> durante un tiempo, porque si una solicitud falla, React Query intenta la solicitud varias veces antes de que indique que la solicitud no es exitosa. Opcionalmente, puede especificar que no se realizan reintentos:
365367

0 commit comments

Comments
 (0)