CN

Maintaining Reactivity in Vue.js: The Pitfall of Destructuring Props

Learn why destructuring props in Vue.js can lead to reactivity issues and how to avoid this common pitfall.

Vue.js is known for its reactivity system, which automatically updates the UI when data changes. However, there's a common pitfall that can break this reactivity: destructuring props. Let's dive into why this happens and how to avoid it.

The Problem

Consider this code:

Example
const { university, intake, activeCoursesList } = defineProps({
  // ... prop definitions
});

const universityIntakeActiveCourses = computed(() => {
  // ... computation using destructured props
});

You might expect universityIntakeActiveCourses to update whenever activeCoursesList changes in the parent component. But it doesn't. Why?

Why Destructuring Breaks Reactivity

When you destructure props, you're creating new local variables that contain the current values of the props. These local variables are not reactive. They're just snapshots of the prop values at the time of destructuring.

Vue's reactivity system works by intercepting access to reactive objects. When you destructure, you're bypassing this system.

The Solution

There are two main ways to maintain reactivity:

1. Access props through the props object

Access props through the props object
const props = defineProps({
  // ... prop definitions
});

const universityIntakeActiveCourses = computed(() => {
  // Use props.university, props.activeCoursesList, etc.
});

2. Use toRefs if you prefer destructuring

Use toRefs
import { toRefs } from 'content/blog/maintaining-reactivity-in-vuejs-the-pitfall-of-destructuring-props.mdx';

const props = defineProps({
  // ... prop definitions
});

const { university, intake, activeCoursesList } = toRefs(props);

const universityIntakeActiveCourses = computed(() => {
  // Now you can use university.value, activeCoursesList.value, etc.
});

toRefs converts each property on the props object into a ref, maintaining the reactive connection.

Best Practices

  1. Avoid destructuring props directly.
  2. If you need to destructure, use toRefs.
  3. When in doubt, access props through the props object.
  4. Remember, refs created by toRefs need to be accessed with .value inside of JavaScript code (but not in templates).

For more information on the limitations of Vue's reactivity system, check out the official Vue.js documentation.

Want to read more articles like that?

Sign up to get notified when I publish more.

No spam. One click unsubscribe.

Read More on Fado Code Camp