Interactive Lab

Vue 3.5 Reactive Props & Modern Composition Primitives

Explore reactive props destructuring, useTemplateRef, useId SSR identifiers, and memory-optimized reactivity engine upgrades.

ModernComponent.vue
<script setup lang="ts">
import { useTemplateRef, useId, watchEffect } from 'vue';

// 1. Vue 3.5 Reactive Props Destructure (No toRefs needed)
const { count = 0, label = 'Metric' } = defineProps<{
  count?: number;
  label?: string;
}>();

// 2. Typed template references via useTemplateRef()
const inputRef = useTemplateRef<HTMLInputElement>('customInput');

// 3. SSR-Safe Unique ID generation
const elementId = useId();

watchEffect(() => {
  // 'count' remains fully reactive despite being destructured!
  console.log(`Prop count changed: ${count}`);
});
</script>

<template>
  <div :id="elementId" class="panel">
    <label :for="`input-${elementId}`">{{ label }}: {{ count }}</label>
    <input :id="`input-${elementId}`" ref="customInput" />
    
    <!-- 4. Deferred Teleport target mounting -->
    <Teleport defer to="#modal-target">
      <div class="teleported-node">Mounted after target renders</div>
    </Teleport>
  </div>
</template>

Vue 3.5 Upgrades

  • Reactive Props Destructure: Destructuring const { prop } = defineProps() retains reactivity via compile-time transforms without needing toRefs().
  • useTemplateRef(): Replaces fragile string-matched ref declarations with typed ref handles that survive refactorings.
  • useId(): Generates deterministic IDs across SSR and client hydration to prevent accessibility attribute mismatches.
  • Reactivity Memory Optimization: Vue 3.5 overhauled internal dependency tracking arrays, reducing reactive memory consumption by ~56%.
Vue 3.5 Props & ID Emulator useId() active
Deterministic useId(): vue-uid-89f2a Reactivity Connected
Destructured Label

Telemetry Node

Destructured Count

42