RosettaJS: Comparativas de Vue, React y Angular

Estado y reactividad

Reaccionar a Cambios de Estado

Existen herramientas que permiten gestionar efectos secundarios en respuesta a cambios en el estado de la aplicación.

Ejemplo

Mostrar una alerta cuando un usuario inicia sesión.

Vuewatch()

<script setup lang="ts">
import { ref, watch } from 'vue'

const logged = ref(false)

watch(
  logged,
  (isLogged) => {
    if (isLogged) {
      alert('User is logged')
    }
  },
  { immediate: true },
)
</script>

<template>
  <button @click="logged = true">Log in</button>
</template>

Se utiliza la función watch(), que permite observar una fuente reactiva. Con immediate: true también ejecuta la comprobación al inicializarse.

ReactuseEffect()

import { useEffect, useState } from 'react'

function LoggedAlert() {
  const [logged, setLogged] = useState(false)

  useEffect(() => {
    if (logged) {
      alert('User is logged')
    }
  }, [logged])

  return <button onClick={() => setLogged(true)}>Log in</button>
}

Al usar el Hook useEffect(), la comprobación se ejecuta después del primer renderizado y cuando cambian sus dependencias.

Angulareffect()

import { Component, effect, signal } from '@angular/core'

@Component({
  selector: 'app-logged-alert',
  standalone: true,
  template: `
    <button (click)="logIn()">Log in</button>
  `,
})
export class LoggedAlertComponent {
  logged = signal(false)

  constructor() {
    effect(() => {
      if (this.logged()) {
        alert('User is logged')
      }
    })
  }

  logIn() {
    this.logged.set(true)
  }
}

La función effect() reacciona a los signals que lee. Se ejecuta inicialmente y cuando estos cambian.