No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

15 Días
11 Hrs
18 Min
50 Seg

Reactividad básica

18/20
Recursos

El concepto de reactividad básica es muy importante en el desarrollo front-end. Se trata del estado de la aplicación con respecto al valor de los datos en cada componente, cómo estos cambian a medida que el usuario interactúa y cómo se actualiza la interfaz.

Problemas en la comunicación de componentes

Cuando pensamos en cómo comunicar un componente padre con su hijo y viceversa, solemos utilizar los decoradores @Input() y @Output().

Pero muchas veces, en aplicaciones grandes, la comunicación de componentes se vuelve mucho más compleja y estas herramientas no alcanzan cuando se necesita enviar información de un componente “hijo” a uno “abuelo”.

reactividad basica angular.png

Solución a la comunicación de componentes

Es recomendable implementar un patrón de diseño para mantener el estado de la aplicación centralizado en un único punto, para que todos los componentes accedan a ellos siempre que necesiten. A este punto central se lo conoce como Store.

reactividad basica.png{height="" width=""}

Implementando un store de datos

Los store de datos suelen implementarse haciendo uso de Observables.

Paso 1:
Importa la clase BehaviorSubject desde la librería RxJS, que te ayudará a crear una propiedad observable, a la cual tu componente pueda suscribirse y reaccionar ante ese cambio de estado.

// services/store.service.ts
import { BehaviorSubject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class StoreService {

  private myShoppingCart: Producto[] = [];
  private myCart = new BehaviorSubject<Producto[]>([]);
  public myCart$ = this.myCart.asObservable();

  constructor() { }

  addProducto(producto: Producto): void {
    // El observable emitirá un nuevo valor con cada producto que se agregue al carrito.
    this.myShoppingCart.push(producto);
    this.myCart.next(this.myShoppingCart);
  }

}

Paso 2: Suscribe a cualquier componente que necesites a estos datos, para reaccionar cuando estos cambian.

// components/nav-bar/nav-bar.component.ts
import { StoreService } from 'src/app/services/store.service';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-nav-bar',
  templateUrl: './nav-bar.component.html',
  styleUrls: ['./nav-bar.component.scss']
})
export class NavBarComponent implements OnInit, OnDestroy {

  private sub$!: Subscription;

  constructor(
    private storeService: StoreService
  ) { }

  ngOnInit(): void {
    this.storeService.myCart$
      .subscribe(data => {
        // Cada vez que el observable emita un valor, se ejecutará este código
        console.log(data);
      });
  }
  
  ngOnDestroy(): void {
    this.sub$.unsubscribe();
  }

}

El lugar más apropiado para esto es en ngOnInit(). No olvides guardar este observable en una propiedad del tipo Subscription para hacer un unsubscribe() cuando el componente sea destruido.

NOTA: Por convención, las propiedades que guardan observables suelen tener un “$” al final del nombre para indicar que se trata de un observable.

Ver código fuente del proyecto


Contribución creada con los aportes de Kevin Fiorentino.

Aportes 47

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Like si tambien te gustaria un curso dedicado a RXJS.

Excelente video, me pareció simplemente genial como Nicolas explica la reactividad, además agradezco que lo hayan incluido ya que es un tema importante, me encantaría ver un curso completo acerca de reactividad para Angular.

Expresa tu apoyo con un me gusta si estas de acuerdo.

Un like si apoyan mi comentario de que haya un curso de Rxjs y ngRx.

Coincido con los comentarios, hace falta un curso especifico de Rxjs en Angular

Es un tema súper importante y merece un curso propio. Tengo la duda de cómo evitar que el contador reinicie cuando el usuario refresca la pantalla? Que opciones hay? Es una buena practica usar LocalStorage?

También todo mi apoyo para un curso de reactividad con RxJS y NGRx en Angular.

Algo super importante cuando existen subscripciones a observables que no son de http o de route (que por sí mismas se destruyen), es que debemos manejar su destrucción del componente. Esto porque puede generar un memory leak.

Yo creé un método que realizara la suscripción y la retornara para manejarla.

getMyCartLength(): Subscription {
    return this._storeService.myCart$
      .subscribe(products => {
        this.counter = products.length;
      });
  }

Y dentro del onInit() la almaceno en una variable o arreglo (en caso que deba manejar más de una subscripción a observables) de tipo Subscription. Ej:

ngOnInit(): void {

    // Si se tendrán más subscripciones
    this.subscriptions = [
      this.getMyCartLength()
    ]

    // Manejar una sola subscripción
    this.subscription = this.getMyCartLength()
  }

Todo esto, para que cuando el componente de desmonte, y se ejecute el método onDestroy() del ciclo de vida. También destruya las subscripciones que tiene activas.

ngOnDestroy(): void {

    // Si se tendrán más subscripciones
    this.subscriptions.forEach(sub => {
      if (sub !== null) {
        sub.unsubscribe()
      }
    });

    // Manejar una sola subscripción
    this.subscription ? this.subscription.unsubscribe() : null;

  }

Seria super bueno que indicaran como se utlizan los test de cada proceso

Quiero un curso de RXJS para Angular

Programación Reactiva

La programación reactiva sigue el patrón de diseño Observer; cuando hay un cambio de estado en un objeto, los otros objetos son notificados y actualizados acorde.

Entender esta parte de reactividad ha hecho que haga un refactoring impresionante a mis proyectos, que excelente curso el del profe !

Ya entendi porque sentia que me costaba un poco mas entender React que otros frameworks o librerias.

Estilos que les pueden servir para su contador

.shopping-cart-container {
      position: relative;
      display: block;
      .counter {
        position: absolute;
        right: -12px;
        top: -4px;
        color: #fefefe;
        font-size: 12px;
        width: 20px;
        height: 20px;
        border-radius: 50%;
        text-align: center;
        line-height: 20px;
        background-color: #458f4b;
      }
    }

apoyo la idea de que se hagan una serie de cursos sobre rxjs y reactividad en angular

Muy buena explicación. El manejo de estado mediante un servicio nos quita de varias cosas como la comunicación que tendríamos que desarrollar para hacerlo por medio de inputs y outputs. Me gustaría saber su opinión de NGRX, aún se sigue usando o realmente hay mejores herramientas para mejorar el estado?

Tengo una gran pregunta, en foros he visto que al utilizar asObservable elimina la implementación del Observador(Observer). Por lo tanto, no puede llamar a next, error & complete en la instancia devuelta por asObservable().
que en typescriipt seria mejor hacer esto:

private messageSubject = new BehaviorSubject<any>(undefined);

public messages$: Observable<any> = this.messageSubject;

Que bonito es lo bonito 😃

Es la 5ta vez que me veo este video. Jajajaja, el impostor me está atacando!

Like si también quieres un curso sobre Akita state management con Angular Está construido sobre RxJS e inspirado en modelos como Flux y Redux. La integración de Akita es más simple que NgRx y NgXs.

Ahi tenes Curso de RxJs

Excelente la explicación de la reactivada con RxJS para Angular y también apoyo que haya un curso de reactivadad con RxJS y NGRx en Angular.

Un curso de RxJS y ngRx please!!!

crazy los observables 🖖

Realicé un post hace un tiempo en dónde trato de hacer mi mayor esfuerzo para explicar sobre este tema, me agradaría mucho que quién pueda verlo, lo lea.


Flux: el flujo de datos que debes entender


Espero que les pueda alimentar el conocimiento

estado global usando servicios y rxjs

este es un video al que he vuelto mas de una vez para seguir profundizando en angular

Con esta opción pueden crear el circulo para la numeración del carrito de compras.

span.red{
background: red;
border-radius: 0.8em;
-moz-border-radius: 0.8em;
-webkit-border-radius: 0.8em;
color: #ffffff;
display: inline-block;
font-weight: bold;
line-height: 1.2em;
margin-right: 15px;
text-align: center;
width: 1.2em;
}

Excelente clase. Hace falta un cursito de RXJS y de NGRX para completar la carrera de Desarrollador Angular

pongan un cursp de rxjs

🤯Increíble y realmente se parece mucho a redux 😅

Hola buenas tardes tengo una pregunta que diferencia hay en usar la forma reactiva vs la inyección de servicios para obtener en mi componente NAV la cantidad de productos que tengo en mi carrito de compras? Espero me puedan ayudar. Muchas gracias
Gracias profe creeme que no estaba entendiendo nada con el input y output, se me haces super as facil aplicar behaviorsubject, muchas gracias! node puedo hacer un curso de rxjs tengo entendido que no todos aplicamos 100% la libreria... estare atento a su respuesta!
por favor quiero aprender rxjs

rxjs es lo mismo qué Ngrx??

Angular es Fascinante… me convenció totalmente, me encanta el orden, me encanta lo sencillo de su implementación, y realmente no parece ser una curva de aprendizaje, compleja, jeje o bueno es que Nico hace un gran trabajo como dicente, entrega muy muy bien el conocimiento. felicitaciones

Explicación magistral! Muchas gracias Nico!!

Este manejo de estado me recuerda muchisimo al useContext de React

En manejo del estado me gusta mucho mas del modo en que se hace en Angular a diferencia de como se tiene que hacer en React, aunque en React me encanta la manera tan facil y practica de comunicar componentes entre si, es una sintaxis mas limpia.

Tenia que decirlo 😄, Me encantan las 2 librerias

Excelente clase, super interesante esta alternativa para comunicación entre componentes!

Mi aporte por si los productos son mas de nueve

<div class="cart">
      <img src="./assets/icons/icon_shopping_cart.svg" alt="logo">
      <span class="span-cart"   *ngIf="counter > 9; else lessLength">+9</span>
      <ng-template #lessLength>
        <span class="span-cart"  >{{counter}}</span>
      </ng-template>
    </div>

Si alguien tiene alguna duda de donde el myCart$ saca los productos, es en el servicio al momento de hacer esto

this.myCart.next(this.myShoppingCart);
    }

se le da la referencia a la lista de productos.

hace falta en curso de ngRX

Super esta clase me gusto poder aplicar Store, poder realizar comunicación entre los componentes y sin tener que estar en input y output 😁