RosettaJS: Comparativas de Vue, React y Angular

Ciclo de vida y DOM

Acceso a Elementos del DOM

El acceso a elementos del DOM permite obtener una referencia directa a un nodo renderizado para leerlo o interactuar con él desde el componente.

Ejemplo

Enfocar un campo de texto al pulsar un botón.

VueuseTemplateRef

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

const inputRef = useTemplateRef<HTMLInputElement>('inputRef')

function focusInput() {
  inputRef.value?.focus()
}
</script>

<template>
  <input ref="inputRef" type="text" />

  <button @click="focusInput">
    Focus input
  </button>
</template>

Usa template refs para obtener una referencia directa a un elemento del DOM después de que se renderiza.

ReactuseRef

import { useRef } from 'react'

function InputFocus() {
  const inputRef = useRef<HTMLInputElement | null>(null)

  function focusInput() {
    inputRef.current?.focus()
  }

  return (
    <>
      <input ref={inputRef} type="text" />

      <button onClick={focusInput}>
        Focus input
      </button>
    </>
  )
}

Usa useRef para guardar una referencia mutable al nodo del DOM y acceder a él desde handlers o efectos.

AngularviewChild()

import { Component, ElementRef, viewChild } from '@angular/core'

@Component({
  selector: 'app-input-focus',
  standalone: true,
  template: `
    <input #inputRef type="text" />

    <button (click)="focusInput()">
      Focus input
    </button>
  `,
})
export class InputFocusComponent {
  inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inputRef')

  focusInput() {
    this.inputRef().nativeElement.focus()
  }
}

Usa viewChild() para consultar un elemento del template y acceder a su ElementRef desde el componente.