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
@@ -393,15 +393,15 @@ Modificar la creación de nuevas anécdotas, de forma que las anécdotas se alma
393
393
394
394
### Acciones asincrónicas y redux thunk
395
395
396
-
Nuestro enfoque está bien, pero no es bueno que la comunicación con el servidor ocurra dentro de las funciones de los componentes. Sería mejor si la comunicación se pudiera abstraer de los componentes, de modo que no tuvieran que hacer nada más que llamar al <i>creador de la acción</i> correspondiente. Como ejemplo, <i>App</i> inicializaría el estado de la aplicación de la siguiente manera:
396
+
Nuestro enfoque es bastante bueno, pero no es genial que la comunicación con el servidor suceda dentro de las funciones de los componentes. Sería mejor si la comunicación pudiera abstraerse de los componentes para que no tengan que hacer nada más que llamar al creador de acciones apropiado. Como ejemplo, <i>App</i> inicializaría el estado de la aplicación de la siguiente manera:
397
397
398
398
```js
399
399
constApp= () => {
400
400
constdispatch=useDispatch()
401
401
402
402
useEffect(() => {
403
403
dispatch(initializeNotes())
404
-
},[dispatch])
404
+
},[dispatch])
405
405
406
406
// ...
407
407
}
@@ -424,86 +424,47 @@ const NewNote = () => {
424
424
}
425
425
```
426
426
427
-
Ambos componentes solo usarían la función que se les proporciona como prop sin importar la comunicación con el servidor que está sucediendo en segundo plano.
427
+
En esta implementación, ambos componentes enviarían una acción sin necesidad de saber sobre la comunicación entre el servidor que sucede detrás de escena. Estos tipos de <i>acciones asincrónicas</i> se pueden implementar utilizando la librería [Redux Thunk](https://github.com/reduxjs/redux-thunk). El uso de la librería no requiere ninguna configuración adicional o incluso instalación cuando el store de Redux se crea utilizando la función <em>configureStore</em> del kit de herramientas de Redux (Redux Toolkit).
428
428
429
-
Ahora instalemos la librería [redux-thunk](https://github.com/gaearon/redux-thunk), que nos permite crear <i>acciones asincrónicas</i>. La instalación se realiza con el comando:
429
+
Con Redux Thunk, es posible implementar <i>action creators</i> que devuelven una función en lugar de un objeto. La función recibe los métodos <em>dispatch</em> y <em>getState</em> del store de Redux como parámetros. Esto permite, por ejemplo, implementaciones de creadores de acciones asincrónicas, que primero esperan la finalización de una cierta operación asincrónica y luego despachan alguna acción, que cambia el estado del store.
430
430
431
-
```bash
432
-
npm install redux-thunk
433
-
```
434
-
435
-
La librería redux-thunk es un <i>redux-middleware</i>, que debe inicializarse junto con la inicialización del store. Mientras estamos aquí, extraigamos la definición del store en su propio archivo <i>src/store.js</i>:
431
+
Podemos implementar el <i>action creator</i> <em>initializeNotes</em> que inicializa las notas basadas en los datos recibidos del servidor de la siguiente manera:
Después de los cambios, el archivo <i>src/index.js</i> se ve así
461
-
After the changes the file <i>src/index.js</i> looks like this
462
-
463
-
```js
464
-
importReactfrom'react'
465
-
importReactDOMfrom'react-dom'
466
-
import { Provider } from'react-redux'
467
-
importstorefrom'./store'// highlight-line
468
-
importAppfrom'./App'
469
-
470
-
ReactDOM.render(
471
-
<Provider store={store}>
472
-
<App />
473
-
</Provider>,
474
-
document.getElementById('root')
475
-
)
476
-
```
477
-
478
-
Gracias a redux-thunk, es posible definir <i>creadores de acciones</i> para que devuelvan una función que tenga como parámetro el método <i>dispatch</i> de redux-store. Como resultado de esto, se pueden hacer creadores de acciones asincrónicas, que primero esperan a que termine alguna operación, luego de lo cual luego envían la acción real.
En la función interna, es decir, la <i>acción asincrónica</i>, la operación primero obtiene todas las notas del servidor y luego envía las notas a la acción, que las agrega al store.
453
+
En la función interna, es decir, la <i>acción asincrónica</i>, la operación primero obtiene todas las notas del servidor y luego <i>despacha</i> la acción <em>setNotes</em>, que las agrega al store.
496
454
497
-
El componente <i>App</i> ahora se puede definir de la siguiente manera:
455
+
El componente <i>App</i> puede inicializar las notas de la siguiente manera:
El estado actual del código para la aplicación se puede encontrar en [github](https://github.com/fullstack-hy2020/redux-notes/tree/part6-4) en la rama <i>part6-4</i>.
564
+
Finalmente, limpiemos un poco el archivo <i>index.js</i> moviendo el código relacionado con la creación del store de Redux a su propio archivo <i>store.js</i>:
565
+
566
+
```js
567
+
import { configureStore } from'@reduxjs/toolkit'
568
+
569
+
importnoteReducerfrom'./reducers/noteReducer'
570
+
importfilterReducerfrom'./reducers/filterReducer'
571
+
572
+
conststore=configureStore({
573
+
reducer: {
574
+
notes: noteReducer,
575
+
filter: filterReducer
576
+
}
577
+
})
578
+
579
+
exportdefaultstore
580
+
```
581
+
582
+
Despues de los cambios, el contenido del archivo <i>index.js</i> es el siguiente:
El estado actual del código de la aplicación se puede encontrar en [GitHub](https://github.com/fullstack-hy2020/redux-notes/tree/part6-5) en la rama <i>part6-5</i>.
599
+
600
+
Redux Toolkit ofrece una gran cantidad de herramientas para simplificar la administración de estado asíncrono. Las herramientas adecuadas para este caso de uso son, por ejemplo, la función [createAsyncThunk](https://redux-toolkit.js.org/api/createAsyncThunk) y la API [RTK Query](https://redux-toolkit.js.org/rtk-query/overview).
560
601
561
602
</div>
562
603
563
604
<divclass="tasks">
564
605
565
606
566
-
### Ejercicios 6.15.-6.18.
607
+
### Ejercicios 6.16.-6.19.
567
608
568
-
#### 6.15 Anécdotas y el backend, paso3
609
+
#### 6.16 Anécdotas y el backend, paso 3
569
610
570
-
Modifique la inicialización de redux-store para que suceda utilizando creadores de acciones asincrónicas, que son posibles gracias a la librería <i>redux-thunk</i>.
611
+
Modifique la inicialización de la redux-store para que suceda utilizando creadores de acciones asincrónicas, que son posibles gracias a la librería <i>redux-thunk</i>.
571
612
572
-
#### 6.16 Anécdotas y el backend, paso 4
613
+
#### 6.17 Anécdotas y el backend, paso 4
573
614
574
615
También modifique la creación de una nueva anécdota para que suceda usando creadores de acciones asincrónicas, hecho posible por la librería <i>redux-thunk</i>.
575
616
576
617
577
-
#### 6.17 Anécdotas y el backend, paso 5
618
+
#### 6.18 Anécdotas y el backend, paso 5
578
619
579
620
La votación aún no guarda los cambios en el backend. Arregle la situación con la ayuda de la librería <i>redux-thunk</i>.
580
621
581
-
#### 6.18 Anécdotas y el backend, paso 6
622
+
#### 6.19 Anécdotas y el backend, paso 6
582
623
583
624
La creación de notificaciones sigue siendo un poco tediosa, ya que hay que realizar dos acciones y utilizar la función _setTimeout_:
0 commit comments