You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/0/es/part0a.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -140,7 +140,7 @@ Al enviar al menos 24 de 29 ejercicios de la parte 9 del curso, TypeScript, pued
140
140
141
141
#### Part 10 - Desarrollo Web Full Stack: React Native (2 crédito, CSM14111)
142
142
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).
144
144
145
145
- Envía al menos 25 ejercicios para la parte 10.
146
146
- [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).
Copy file name to clipboardExpand all lines: src/content/1/es/part1c.md
+29-29Lines changed: 29 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,11 +1,11 @@
1
-
---
1
+
---
2
2
mainImage: ../../../images/part-1.svg
3
3
part: 1
4
4
letter: c
5
5
lang: es
6
-
---
6
+
---
7
7
8
-
<divclass="content">
8
+
<divclass="content">
9
9
10
10
Volvamos a trabajar con React.
11
11
@@ -212,7 +212,7 @@ El componente de la aplicación recibe el valor del contador a través de la pro
212
212
counter +=1
213
213
```
214
214
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:
216
216
217
217
```js
218
218
let counter =1
@@ -230,7 +230,7 @@ counter += 1
230
230
refresh()
231
231
```
232
232
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.
234
234
235
235
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.
236
236
@@ -249,9 +249,9 @@ Hacer llamadas repetidas al método _ReactDOM.render_ no es la forma recomendada
249
249
250
250
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.
251
251
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.
253
253
254
-
Cambiaremos la aplicación a lo siguiente. <i>main.jsx</i> regresa a
254
+
Cambiaremos la aplicación a lo siguiente:
255
255
256
256
```js
257
257
importReactDOMfrom'react-dom/client'
@@ -364,7 +364,7 @@ Es fácil de seguir y rastrear las llamadas realizadas a la <i>App</i> función
364
364
365
365

366
366
367
-
### Manejo de eventos
367
+
### Manejo de eventos
368
368
369
369
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.
370
370
@@ -441,7 +441,7 @@ const App = () => {
441
441
plus
442
442
</button>
443
443
// highlight-start
444
-
<button onClick={() =>setCounter(0)}>
444
+
<button onClick={() =>setCounter(0)}>
445
445
zero
446
446
</button>
447
447
// highlight-end
@@ -462,50 +462,50 @@ Definimos los controladores de eventos para nuestros botones donde declaramos su
462
462
</button>
463
463
```
464
464
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?
466
466
467
467
```js
468
-
<button onClick={setCounter(counter +1)}>
468
+
<button onClick={setCounter(counter +1)}>
469
469
plus
470
470
</button>
471
471
```
472
472
473
473
Esto rompería completamente nuestra aplicación:
474
474
475
475

476
-
476
+
477
477
¿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
478
478
479
479
```js
480
480
<button onClick={setCounter(counter +1)}>
481
481
```
482
482
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.
484
484
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...
485
485
486
486
Definamos los controladores de eventos como lo hicimos antes
487
487
488
488
```js
489
-
<button onClick={() =>setCounter(counter +1)}>
489
+
<button onClick={() =>setCounter(counter +1)}>
490
490
plus
491
491
</button>
492
492
```
493
493
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.
496
496
497
497
Por lo general, definir controladores de eventos dentro de las plantillas JSX no es una buena idea.
498
498
Aquí está bien, porque nuestros controladores de eventos son muy simples.
499
499
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:
501
501
502
502
```js
503
503
constApp= () => {
504
504
const [ counter, setCounter ] =useState(0)
505
505
506
506
// highlight-start
507
507
constincreaseByOne= () =>setCounter(counter +1)
508
-
508
+
509
509
constsetToZero= () =>setCounter(0)
510
510
// highlight-end
511
511
@@ -525,7 +525,7 @@ const App = () => {
525
525
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:
526
526
527
527
```js
528
-
<button onClick={increaseByOne}>
528
+
<button onClick={increaseByOne}>
529
529
plus
530
530
</button>
531
531
```
@@ -534,11 +534,11 @@ Aquí los controladores de eventos se han definido correctamente. El valor del a
534
534
535
535
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.
536
536
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.
538
538
539
539
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:
540
540
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>
542
542
543
543
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>:
544
544
@@ -550,7 +550,7 @@ const Display = (props) => {
550
550
}
551
551
```
552
552
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_:
554
554
555
555
```js
556
556
constApp= () => {
@@ -565,7 +565,7 @@ const App = () => {
565
565
<button onClick={increaseByOne}>
566
566
plus
567
567
</button>
568
-
<button onClick={setToZero}>
568
+
<button onClick={setToZero}>
569
569
zero
570
570
</button>
571
571
</div>
@@ -608,11 +608,11 @@ const App = () => {
608
608
<Button
609
609
handleClick={setToZero}
610
610
text='zero'
611
-
/>
611
+
/>
612
612
<Button
613
613
handleClick={decreaseByOne}
614
614
text='minus'
615
-
/>
615
+
/>
616
616
// highlight-end
617
617
</div>
618
618
)
@@ -627,10 +627,10 @@ El controlador de eventos se pasa al componente <i>Button</i> a través de la pr
627
627
628
628
Repasemos los principios fundamentales de cómo funciona una aplicación una vez más.
629
629
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.
632
632
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_.
634
634
**Llamar a una función que cambia el estado hace que el componente se vuelva a procesar.**
635
635
636
636
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 = () => {
667
667
<Button onClick={decreaseByOne} text="minus"/>
668
668
</div>
669
669
)
670
-
}
670
+
}
671
671
```
672
672
673
673
Dejanos ahora ver que se imprime en la consola cuando se hace clic en los botones plus, zero y minus:
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.
**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.
@@ -363,7 +365,7 @@ Most React applications need not only a way to temporarily store the served data
363
365
364
366
### Exercises 6.20.-6.22.
365
367
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>.
Copy file name to clipboardExpand all lines: src/content/6/es/part6b.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -413,9 +413,9 @@ Hay un pequeño defecto cosmético en nuestra aplicación. Aunque el filtro est
413
413
414
414
#### 6.9 Mejores anécdotas, paso 7
415
415
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>.
417
417
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:
419
419
420
420
```js
421
421
constFilter= () => {
@@ -716,11 +716,11 @@ Continuemos trabajando en la aplicación de anécdotas que comenzamos en el ejer
716
716
717
717
#### 6.10 Mejores anécdotas, paso 8
718
718
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.
720
720
721
721
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.
722
722
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.
Nuestra solución es buena. Excepto que no funciona. La nueva nota se guarda en el servidor, pero no se actualiza en la pantalla.
207
207
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).
209
209
210
210
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:
@@ -359,7 +361,7 @@ La aplicación debe funcionar de tal manera que si hay problemas para comunicars
359
361
360
362

361
363
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.
363
365
364
366
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:
0 commit comments