RosettaJS: Comparativas de Vue, React y Angular

Estado y reactividad

Estado Basado en Objetos

Este tipo de estado permite agrupar varias propiedades relacionadas dentro de una sola estructura reactiva.

Ejemplo

Actualizar la edad de una persona guardada dentro de un objeto.

Vuereactive

<script setup lang="ts">
import { reactive } from 'vue';

const user = reactive({
  name: 'Alex',
  age: 28,
});

function incrementAge() {
  user.age++;
}
</script>

<template>
  <button @click="incrementAge">
    {{ user.name }}: {{ user.age }}
  </button>
</template>

Usa reactive para agrupar varias propiedades relacionadas dentro de un mismo objeto reactivo.

ReactuseState

import { useState } from 'react';

function UserCard() {
  const [user, setUser] = useState({
    name: 'Alex',
    age: 28,
  });

  function incrementAge() {
    setUser({
      ...user,
      age: user.age + 1,
    });
  }

  return (
    <button onClick={incrementAge}>
      {user.name}: {user.age}
    </button>
  );
}

Guarda el objeto completo con useState y crea una nueva copia al actualizar una de sus propiedades.

Angularsignal

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

@Component({
  selector: 'app-user-card',
  standalone: true,
  template: `
    <button (click)="incrementAge()">
      {{ user().name }}: {{ user().age }}
    </button>
  `
})
export class UserCardComponent {
  user = signal({
    name: 'Alex',
    age: 28,
  });

  incrementAge() {
    this.user.update((currentUser) => ({
      ...currentUser,
      age: currentUser.age + 1,
    }));
  }
}

Guarda el objeto en un signal y genera un nuevo objeto al actualizar una de sus propiedades.