Skip to content

Commit 536039e

Browse files
committed
docs(es/part6): sync Spanish content with current English version
Synchronize Spanish translation of Part 6 with the current English version, bringing it fully up to date.
1 parent 3d54771 commit 536039e

File tree

5 files changed

+720
-512
lines changed

5 files changed

+720
-512
lines changed

src/content/6/es/part6.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ lang: es
88

99
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.
1010

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.
1212

13-
<i>Parte actualizada el 23 de Agosto de 2023</i>
14-
- <i>Create React App reemplazado con Vite</i>
15-
- <i>React Query actualizado a la versión 4</i>
13+
<i>Parte actualizada el 12 de Octubre de 2025</i>
14+
- <i>Node actualizado a la versión 22.18.0</i>
15+
- <i>Jest reemplazado con Vitest</i>
16+
- <i>Axios reemplazado con Fetch API</i>
1617

1718
</div>

src/content/6/es/part6a.md

Lines changed: 89 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -270,16 +270,20 @@ Nota adicional: <i>createStore</i> se define como "obsoleto", lo que generalment
270270

271271
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.
272272

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:
274274

275275
```js
276+
import ReactDOM from 'react-dom/client'
277+
import { createStore } from 'redux'
278+
276279
const noteReducer = (state = [], action) => {
277-
if (action.type === 'NEW_NOTE') {
278-
state.push(action.payload)
279-
return state
280+
switch (action.type) {
281+
case 'NEW_NOTE':
282+
state.push(action.payload)
283+
return state
284+
default:
285+
return state
280286
}
281-
282-
return state
283287
}
284288

285289
const store = createStore(noteReducer)
@@ -303,18 +307,27 @@ store.dispatch({
303307
})
304308

305309
const App = () => {
306-
return(
310+
return (
307311
<div>
308312
<ul>
309-
{store.getState().map(note=>
313+
{store.getState().map(note => (
310314
<li key={note.id}>
311315
{note.content} <strong>{note.important ? 'important' : ''}</strong>
312316
</li>
313-
)}
314-
</ul>
317+
))}
318+
</ul>
315319
</div>
316320
)
317321
}
322+
323+
const root = ReactDOM.createRoot(document.getElementById('root'))
324+
325+
const renderApp = () => {
326+
root.render(<App />)
327+
}
328+
329+
renderApp()
330+
store.subscribe(renderApp)
318331
```
319332

320333
Hasta el momento la aplicación no tiene la funcionalidad para agregar nuevas notas, aunque es posible hacerlo enviando acciones <i>NEW\_NOTE</i>.
@@ -340,12 +353,13 @@ La versión inicial del reducer es muy sencilla:
340353

341354
```js
342355
const noteReducer = (state = [], action) => {
343-
if (action.type === 'NEW_NOTE') {
344-
state.push(action.payload)
345-
return state
356+
switch (action.type) {
357+
case 'NEW_NOTE':
358+
state.push(action.payload)
359+
return state
360+
default:
361+
return state
346362
}
347-
348-
return state
349363
}
350364
```
351365

@@ -359,13 +373,12 @@ Agregamos una nueva nota al estado con el método _state.push(action.payload)_ q
359373

360374
```js
361375
const noteReducer = (state = [], action) => {
362-
if (action.type === 'NEW_NOTE') {
363-
// highlight-start
364-
return state.concat(action.payload)
365-
// highlight-end
376+
switch (action.type) {
377+
case 'NEW_NOTE':
378+
return state.concat(action.payload) // highlight-line
379+
default:
380+
return state
366381
}
367-
368-
return state
369382
}
370383
```
371384

@@ -382,23 +395,14 @@ Ampliemos nuestro reducer para que pueda manejar el cambio de importancia de una
382395
}
383396
```
384397

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).
386399

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
388401

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:
392403

393-
A continuación crearemos el archivo <i>.babelrc</i>, con el siguiente contenido:
394-
395-
```json
396-
{
397-
"presets": [
398-
"@babel/preset-env",
399-
["@babel/preset-react", { "runtime": "automatic" }]
400-
]
401-
}
404+
```js
405+
npm install --save-dev vitest
402406
```
403407

404408
Expandamos <i>package.json</i> con un script para ejecutar las pruebas:
@@ -409,40 +413,58 @@ Expandamos <i>package.json</i> con un script para ejecutar las pruebas:
409413
"scripts": {
410414
"dev": "vite",
411415
"build": "vite build",
412-
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
416+
"lint": "eslint .",
413417
"preview": "vite preview",
414-
"test": "jest" // highlight-line
418+
"test": "vitest" // highlight-line
415419
},
416420
// ...
417421
}
418422
```
419423

420-
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>:
421425

422426
```js
423-
module.exports = {
424-
root: true,
425-
env: {
426-
browser: true,
427-
es2020: true,
428-
"jest/globals": true // highlight-line
429-
},
430-
// ...
427+
const noteReducer = (state = [], action) => {
428+
switch (action.type) {
429+
case 'NEW_NOTE':
430+
return state.concat(action.payload)
431+
default:
432+
return state
433+
}
431434
}
435+
436+
export default noteReducer
432437
```
433438

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:
440+
441+
```js
442+
import ReactDOM from 'react-dom/client'
443+
import { createStore } from 'redux'
444+
import noteReducer from './reducers/noteReducer' // highlight-line
445+
446+
const store = createStore(noteReducer)
447+
448+
// ...
449+
```
450+
451+
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.
435452
Instalemos la librería como una dependencia de desarrollo:
436453

437454
```js
438455
npm install --save-dev deep-freeze
439456
```
440457

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:
442463

443464
```js
444-
import noteReducer from './noteReducer'
445465
import deepFreeze from 'deep-freeze'
466+
import { describe, expect, test } from 'vitest'
467+
import noteReducer from './noteReducer'
446468

447469
describe('noteReducer', () => {
448470
test('returns new state with action NEW_NOTE', () => {
@@ -465,6 +487,8 @@ describe('noteReducer', () => {
465487
})
466488
```
467489

490+
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+
468492
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á
469493

470494
![terminal mostrando test fallando y error acerca de no usar array.push](../../images/6/2.png)
@@ -688,6 +712,7 @@ y una base para sus pruebas
688712

689713
```js
690714
import deepFreeze from 'deep-freeze'
715+
import { describe, expect, test } from 'vitest'
691716
import counterReducer from './reducer'
692717

693718
describe('unicafe reducer', () => {
@@ -1104,20 +1129,20 @@ La versión actual de la aplicación se puede encontrar en [GitHub](https://gith
11041129

11051130
### Más componentes
11061131

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>:
11081133

11091134
```js
1110-
import { useDispatch } from 'react-redux' // highlight-line
1111-
import { createNote } from '../reducers/noteReducer' // highlight-line
1135+
import { useDispatch } from 'react-redux'
1136+
import { createNote } from '../reducers/noteReducer'
11121137

1113-
const NewNote = () => {
1114-
const dispatch = useDispatch() // highlight-line
1138+
const NoteForm = () => {
1139+
const dispatch = useDispatch()
11151140

11161141
const addNote = (event) => {
11171142
event.preventDefault()
11181143
const content = event.target.note.value
11191144
event.target.note.value = ''
1120-
dispatch(createNote(content)) // highlight-line
1145+
dispatch(createNote(content))
11211146
}
11221147

11231148
return (
@@ -1128,12 +1153,12 @@ const NewNote = () => {
11281153
)
11291154
}
11301155

1131-
export default NewNote
1156+
export default NoteForm
11321157
```
11331158

11341159
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.
11351160

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>:
11371162

11381163
```js
11391164
import { useDispatch, useSelector } from 'react-redux' // highlight-line
@@ -1172,18 +1197,22 @@ export default Notes
11721197

11731198
La lógica para cambiar la importancia de una nota ahora está en el componente que administra la lista de notas.
11741199

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>:
11761201

11771202
```js
1178-
const App = () => {
1203+
import NoteForm from './components/NoteForm'
1204+
import Notes from './components/Notes'
11791205

1206+
const App = () => {
11801207
return (
11811208
<div>
1182-
<NewNote />
1209+
<NoteForm />
11831210
<Notes />
11841211
</div>
11851212
)
11861213
}
1214+
1215+
export default App
11871216
```
11881217

11891218
<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

Comments
 (0)