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/6/es/part6.md
+5-4Lines changed: 5 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,10 +8,11 @@ lang: es
8
8
9
9
Hasta ahora, hemos colocado el estado de la aplicación y la lógica de estado directamente dentro de los componentes de React. Cuando las aplicaciones crecen, la administración del estado debe trasladarse fuera de los componentes de React. En esta parte, presentaremos la librería Redux, que actualmente es la solución más popular para administrar el estado de las aplicaciones React.
10
10
11
-
Aprenderemos sobre la versión ligera de Redux compatible directamente con React, es decir el contexto de React y el hook useRedux, también sobre la librería React Query que simplifica la gestión de estados de la aplicación.
11
+
Aprenderemos sobre la versión ligera de Redux compatible directamente con React, es decir el contexto de React y el hook useReducer, también sobre la librería React Query que simplifica la gestión de estados de la aplicación.
Copy file name to clipboardExpand all lines: src/content/6/es/part6a.md
+89-60Lines changed: 89 additions & 60 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -270,16 +270,20 @@ Nota adicional: <i>createStore</i> se define como "obsoleto", lo que generalment
270
270
271
271
Nuestro objetivo es modificar nuestra aplicación de notas para utilizar Redux para la gestión del estado. Sin embargo, primero cubramos algunos conceptos clave a través de una aplicación de notas simplificada.
272
272
273
-
La primera versión de nuestra aplicación es la siguiente
273
+
La primera versión de nuestra aplicación, escrita en el archivo <i>main.jsx</i>, se ve de la siguiente manera:
@@ -382,23 +395,14 @@ Ampliemos nuestro reducer para que pueda manejar el cambio de importancia de una
382
395
}
383
396
```
384
397
385
-
Dado que todavía no tenemos ningún código que utilice esta funcionalidad, estamos expandiendo el reducer en la forma 'test driven' (guiada por pruebas). Comencemos creando una prueba para manejar la acción <i>NEW\_NOTE</i>.
398
+
Dado que todavía no tenemos ningún código que utilice esta funcionalidad, estamos expandiendo el reducer en la forma 'test driven' (guiada por pruebas).
386
399
387
-
Tenemos que configurar primero la biblioteca de pruebas[Jest](https://jestjs.io/) para el proyecto. Vamos a instalar las siguientes dependencias:
400
+
### Configurando el entorno de pruebas
388
401
389
-
```js
390
-
npm install --save-dev jest @babel/preset-env @babel/preset-react eslint-plugin-jest
391
-
```
402
+
Tenemos que configurar primero la biblioteca de pruebas [Vitest](https://vitest.dev/) para el proyecto. Vamos a instalarla como una dependencia de desarrollo para la aplicación:
392
403
393
-
A continuación crearemos el archivo <i>.babelrc</i>, con el siguiente contenido:
Y finalmente, <i>.eslint.cjs</i> necesita ser modificado de la siguiente manera:
424
+
Para hacer las pruebas más fáciles, primero trasladaremos el código del reducer a su propio módulo, al archivo <i>src/reducers/noteReducer.js</i>:
421
425
422
426
```js
423
-
module.exports= {
424
-
root:true,
425
-
env: {
426
-
browser:true,
427
-
es2020:true,
428
-
"jest/globals":true// highlight-line
429
-
},
430
-
// ...
427
+
constnoteReducer= (state= [], action) => {
428
+
switch (action.type) {
429
+
case'NEW_NOTE':
430
+
returnstate.concat(action.payload)
431
+
default:
432
+
return state
433
+
}
431
434
}
435
+
436
+
exportdefaultnoteReducer
432
437
```
433
438
434
-
Para hacer las pruebas más fáciles, primero trasladaremos el código del reducer a su propio módulo, al archivo <i>src/reducers/noteReducer.js</i>. También agregaremos la librería [deep-freeze](https://www.npmjs.com/package/deep-freeze), que se puede usar para garantizar que el reducer se haya definido correctamente como una función inmutable.
439
+
El archivo <i>main.jsx</i> cambia de la siguiente manera:
También agregaremos la librería [deep-freeze](https://www.npmjs.com/package/deep-freeze), que se puede usar para garantizar que el reducer se haya definido correctamente como una función inmutable.
435
452
Instalemos la librería como una dependencia de desarrollo:
436
453
437
454
```js
438
455
npm install --save-dev deep-freeze
439
456
```
440
457
441
-
La prueba, que definimos en el archivo <i>src/reducers/noteReducer.test.js</i>, tiene el siguiente contenido:
458
+
Ahora estamos listos para escribir pruebas.
459
+
460
+
### Pruebas para noteReducer
461
+
462
+
Comencemos creando una prueba para manejar la acción <i>NEW\_NOTE</i>. La prueba, que definimos en el archivo <i>src/reducers/noteReducer.test.js</i>, tiene el siguiente contenido:
442
463
443
464
```js
444
-
importnoteReducerfrom'./noteReducer'
445
465
importdeepFreezefrom'deep-freeze'
466
+
import { describe, expect, test } from'vitest'
467
+
importnoteReducerfrom'./noteReducer'
446
468
447
469
describe('noteReducer', () => {
448
470
test('returns new state with action NEW_NOTE', () => {
Ejecuta la prueba con <i>npm test</i>. La prueba asegura que el nuevo estado devuelto por el reducer es un array que contiene un solo elemento, que es el mismo objeto que el que está en el campo <i>payload</i> de la acción.
491
+
468
492
El comando <i>deepFreeze(state)</i> asegura que el reducer no cambie el estado del store que se le dio como parámetro. Si el reducer usa el comando _push_ para manipular el estado, la prueba no pasará
469
493
470
494

@@ -688,6 +712,7 @@ y una base para sus pruebas
688
712
689
713
```js
690
714
importdeepFreezefrom'deep-freeze'
715
+
import { describe, expect, test } from'vitest'
691
716
importcounterReducerfrom'./reducer'
692
717
693
718
describe('unicafe reducer', () => {
@@ -1104,20 +1129,20 @@ La versión actual de la aplicación se puede encontrar en [GitHub](https://gith
1104
1129
1105
1130
### Más componentes
1106
1131
1107
-
Separemos la creación de una nueva nota en su propio componente.
1132
+
Separemos el formulario responsable de crear una nueva nota en su propio componente en el archivo <i>src/components/NoteForm.jsx</i>:
A diferencia del código de React que hicimos sin Redux, el controlador de eventos para cambiar el estado de la aplicación (que ahora vive en Redux) se ha movido de <i>App</i> a un componente hijo. La lógica para cambiar el estado en Redux todavía está claramente separada de toda la parte de React de la aplicación.
1135
1160
1136
-
También separaremos la lista de notas y mostraremos una sola nota en sus propios componentes (que se colocarán en el archivo <i>Notes.jsx</i>):
1161
+
También separaremos la lista de notas y mostraremos una sola nota en sus propios componentes. Coloquemos ambos en el archivo <i>src/components/Notes.jsx</i>:
La lógica para cambiar la importancia de una nota ahora está en el componente que administra la lista de notas.
1174
1199
1175
-
No queda mucho código en <i>App</i>:
1200
+
Solo queda una pequeña cantidad de código en el archivo <i>App.jsx</i>:
1176
1201
1177
1202
```js
1178
-
constApp= () => {
1203
+
importNoteFormfrom'./components/NoteForm'
1204
+
importNotesfrom'./components/Notes'
1179
1205
1206
+
constApp= () => {
1180
1207
return (
1181
1208
<div>
1182
-
<NewNote/>
1209
+
<NoteForm/>
1183
1210
<Notes />
1184
1211
</div>
1185
1212
)
1186
1213
}
1214
+
1215
+
exportdefaultApp
1187
1216
```
1188
1217
1189
1218
<i>Note</i>, responsable de representar una sola nota, es muy simple y no es consciente de que el controlador de eventos que obtiene como props despacha una acción. Este tipo de componentes se denominan [presentacionales](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0) en la terminología de React.
0 commit comments