Pre-order my new book on Vue Design Patterns at 30% discount. Click here for more details

Ultimate Guide to Vue 3 Reactivity

Published by Solomon Eseme's profile picture Solomon Eseme on  Mon, 29 May 2023 19:30:00 GMT

Introduction

Reactivity is one of the key features that make Vue.js a powerful framework for building interactive and dynamic web applications. It allows developers to declaratively define relationships between data and the UI, ensuring that changes in data are automatically reflected in the UI and vice versa.

In Vue 3, the reactivity system has been enhanced with the Composition API, providing more flexibility and control.

In this article, we will explore the concept of reactivity in Vue 3, discussing the reactivity model, reactive data, computed properties, and reactivity caveats.

Understanding Reactivity in Vue 3

Reactivity in Vue 3 revolves around the idea of tracking dependencies between data and UI elements. When data changes, the UI is automatically updated to reflect the changes, and when the UI triggers changes, the data is updated accordingly. This bidirectional synchronization is achieved through Vue's reactivity system, which is based on the underlying JavaScript Proxy object.

Vue 3 uses a fine-grained reactivity model, where only properties accessed during the rendering process are tracked. This means that only the data that is actually used in the template or computed properties will trigger reactivity. This optimized approach ensures efficient reactivity and performance.

Reactive Data

In Vue 3, you can create reactive data using the reactive function from the Composition API. The reactive function takes an object and returns a reactive proxy of that object. Let's see an example:

import { reactive } from "vue";

const state = reactive({
message: "Hello, Vue 3!",
});

console.log(state.message); // Output: Hello, Vue 3!

In this example, the reactive function is used to create a reactive object state with a single property message. Any changes to the message property will be automatically reflected in the UI.

Computed Properties

Computed properties are an essential part of reactivity in Vue 3. They allow you to define derived values that automatically update when their dependencies change. Computed properties are created using the computed function from the Composition API. Let's take a look at an example:

import { reactive, computed } from "vue";

const state = reactive({
firstName: "John",
lastName: "Doe",
});

const fullName = computed(() => {
return `${state.firstName} ${state.lastName}`;
});

console.log(fullName.value); // Output: John Doe

In this example, a computed property fullName is defined based on the firstName and lastName properties of the reactive state object. Whenever either firstName or lastName changes, the fullName computed property will be recalculated automatically.

Reactivity Caveats

While Vue 3's reactivity system provides a powerful and intuitive way to manage data and UI synchronization, there are a few caveats to keep in mind:

1. Array Reactivity

By default, Vue 3's reactivity system cannot automatically detect changes in array elements when using index-based mutations (e.g., array[index] = value). To ensure reactivity, you should use array methods like push, pop, splice, etc., or use the set function from the Composition API. Here's an example:

import { reactive, set } from "vue";

const state = reactive({
list: ["item 1", "item 2", "item 3"],
});

// Correct way to update an array element
set(state.list, 0, "updated item");

console.log(state.list); // Output: ['updated item', 'item 2', 'item 3']

2. Object Properties Reactivity

Similar to arrays, Vue 3's reactivity system also faces limitations when it comes to detecting changes in object properties that are added or removed dynamically. To ensure reactivity for dynamically added properties, you can use the reactive function on the entire object or use the set function to add properties. Here's an example:

import { reactive, set } from "vue";

const state = reactive({
obj: {
prop1: "value 1",
},
});

// Adding a new property
set(state.obj, "prop2", "value 2");

console.log(state.obj); // Output: { prop1: 'value 1', prop2: 'value 2' }

3. Asynchronous Updates

Vue 3's reactivity system may not immediately trigger updates for asynchronously modified data, such as data changes inside setTimeout or AJAX callbacks. In such cases, you can use the nextTick function from the Composition API to ensure the UI is updated after the next DOM update cycle. Here's an example:

import { reactive, nextTick } from "vue";

const state = reactive({
message: "Hello",
});

setTimeout(() => {
state.message = "Hello, Vue 3!";
console.log(state.message); // Output: Hello, Vue 3!
}, 1000);

nextTick(() => {
console.log(state.message); // Output: Hello, Vue 3!
});

Learning and Using Reactivity in Vue 3

To learn more about reactivity in Vue 3 and deepen your understanding, here are some recommended resources:

By studying these resources, you will gain a comprehensive understanding of Vue 3's reactivity system, its principles, and how to leverage it effectively in your Vue applications.

Conclusion

Reactivity is a fundamental concept in Vue 3 that enables seamless synchronization between data and the UI. By understanding the reactivity model, working with reactive data, and utilizing computed properties, you can build powerful and dynamic Vue applications. However, it's important to be aware of the reactivity caveats and follow best practices to ensure optimal reactivity and performance.

In this article, we explored the concept of reactivity in Vue 3, covering reactive data, computed properties, and important considerations. Armed with this knowledge, you can confidently leverage Vue 3's reactivity system to create highly interactive and responsive applications.

Remember to refer to the official Vue 3 documentation and additional learning resources for further exploration and mastery of reactivity in Vue 3.

Resources

Architecting Vue.js 3 Enterprise-Ready Web Applications

Get the FREE chapter!

With this 15+ pages long chapter You will learn how to unit test a Vue.js 3 component and the components and pages’ methods: You will also learn Unit Testing tools such as Jest and Mocha and use them to effectively unit Test an enterprise project.

    Architecting Vue.js 3 Enterprise-Ready Web Applications chapter 9 Best Practice in Unit Testing