Understanding Reactivity Caveats and Limitations in Vue
📖 Scenario: You are building a simple Vue 3 app to track a list of tasks. You want to learn how Vue's reactivity system works and what its limits are.This will help you avoid common mistakes when updating data so your app updates correctly.
🎯 Goal: Create a Vue 3 component that shows a list of tasks and lets you add new tasks. You will learn how to set up reactive data, add a reactive property, update the list reactively, and handle Vue's reactivity caveats.
📋 What You'll Learn
Use Vue 3 Composition API with <script setup>
Create a reactive array of tasks
Add a reactive property to track new task input
Add a function to add new tasks to the reactive array
Demonstrate a reactivity caveat by adding a new property to an existing reactive object
💡 Why This Matters
🌍 Real World
Understanding Vue's reactivity caveats helps you build reliable user interfaces that update correctly when data changes.
💼 Career
Vue developers must know how reactivity works to avoid bugs and write maintainable, efficient code in real projects.
Progress0 / 4 steps
1
Setup reactive tasks array
Create a Vue 3 component with <script setup>. Inside it, create a reactive array called tasks with these exact strings: 'Buy groceries', 'Walk the dog', and 'Read a book'.
Vue
Hint
Use ref from Vue to create a reactive array called tasks.
2
Add reactive new task input
Add a reactive string variable called newTask initialized to an empty string '' inside the <script setup>.
Vue
Hint
Use ref to create a reactive string variable newTask with an empty string.
3
Add function to add new tasks
Add a function called addTask that pushes the value of newTask.value into the tasks.value array, then clears newTask.value to an empty string ''.
Vue
Hint
Define a function addTask that updates the reactive array and clears the input.
4
Demonstrate reactivity caveat with new property
Inside <script setup>, create a reactive object called taskDetails with one property completed set to false. Then add a new property priority with value 'high' directly on taskDetails.value after creation to show Vue does not detect this addition reactively.
Vue
Hint
Create a reactive object with ref and add a new property after creation to see Vue's reactivity caveat.
Practice
(1/5)
1. Which of the following is a known limitation of Vue's reactivity system?
easy
A. Using Vue's reactive() function disables reactivity for nested objects.
B. Changing a reactive property always triggers an update immediately.
C. Adding a new property directly to an existing reactive object won't trigger updates.
D. Vue automatically tracks changes to all array indices without exceptions.
Solution
Step 1: Understand Vue's reactivity on object properties
Vue cannot detect new properties added directly to an existing reactive object after its creation.
Step 2: Compare options with this limitation
Adding a new property directly to an existing reactive object won't trigger updates correctly states this limitation. The other options are incorrect because reactive() supports nested objects, property changes do trigger updates (though batched asynchronously), and Vue has exceptions for some array changes like setting length.
Final Answer:
Adding a new property directly to an existing reactive object won't trigger updates. -> Option C
Quick Check:
New object properties not reactive = C [OK]
Hint: Remember: Vue can't detect new object properties added later [OK]
Common Mistakes:
Assuming all object property additions are reactive
Thinking array index changes always trigger updates
Believing reactive() disables nested reactivity
2. Which syntax correctly updates an array element reactively in Vue?
easy
A. myArray[2] = 'new value'
B. myArray = ['new value']
C. myArray.push('new value')
D. myArray.$set(2, 'new value')
Solution
Step 1: Identify reactive array update methods
Directly assigning to an array index (like myArray[2] = ...) is reactive in Vue 3 for reactive arrays.
Step 2: Evaluate each option
myArray[2] = 'new value' uses direct assignment which triggers reactivity in Vue 3. myArray = ['new value'] replaces the whole array. myArray.push('new value') adds an element at the end. myArray.$set(2, 'new value') uses Vue 2 syntax unavailable in Vue 3.
Final Answer:
myArray[2] = 'new value' -> Option A
Quick Check:
Direct array index updates reactive in Vue 3 = A [OK]
Hint: Directly assign to reactive array indices in Vue 3 [OK]
Common Mistakes:
Replacing the entire array instead of updating an element
A. newProp is added but changes won't trigger updates
B. newProp is reactive and logs 123
C. newProp is not reactive and logs undefined
D. Code throws a runtime error
Solution
Step 1: Check adding new properties to reactive objects
Vue cannot detect new properties added directly to reactive objects after creation, so newProp is added but not reactive.
Step 2: Understand console output and reactivity
newProp logs 123 correctly, but changes to it won't trigger UI updates because Vue didn't track it reactively.
Final Answer:
newProp is added but changes won't trigger updates -> Option A
Quick Check:
New object properties added later not tracked = B [OK]
Hint: New object properties added later are not reactive by default [OK]
Common Mistakes:
Assuming newProp is reactive immediately
Expecting undefined instead of 123
Thinking code throws an error
5. You want to add a new property age to a reactive object user and ensure Vue tracks it reactively. Which approach is correct?
hard
A. user['age'] = 30
B. user.age = 30
C. Vue.set(user, 'age', 30)
D. user = { ...user, age: 30 }
Solution
Step 1: Understand Vue 3 reactivity and adding new properties
Vue 3 does not track new properties added directly to reactive objects. Using object spread creates a new reactive object with the new property.
Step 2: Evaluate each option for reactivity
Direct property assignments do not make properties reactive. Vue.set(user, 'age', 30) is Vue 2 syntax and not available in Vue 3. user = { ...user, age: 30 } creates a new reactive object with age included, ensuring reactivity.
Final Answer:
user = { ...user, age: 30 } -> Option D
Quick Check:
Use object spread to add reactive properties = A [OK]
Hint: Use object spread to add reactive properties in Vue 3 [OK]
Common Mistakes:
Using Vue.set in Vue 3 (deprecated)
Adding properties directly expecting reactivity
Confusing direct assignment with reactive update
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.