This Vue component shows how to destructure a reactive object using toRefs. The values x and y stay reactive and update the template when changed.
Vue
<template>
<div>
<p>X: {{ x }}</p>
<p>Y: {{ y }}</p>
<button @click="x++">Increase X</button>
</div>
</template>
<script setup>
import { reactive, toRefs } from'vue';
const state = reactive({ x: 0, y: 0 });
const { x, y } = toRefs(state);
</script>
OutputSuccess
Important Notes
Using normal destructuring on reactive objects breaks reactivity.
toRef is useful when you want just one property as a ref.
toRefs is handy to destructure all properties at once.
Summary
toRef creates a reactive reference to a single property.
toRefs creates reactive references for all properties in an object.
Both help keep reactivity when destructuring reactive objects.
Practice
(1/5)
1. What is the main purpose of toRef in Vue's Composition API?
easy
A. To convert a ref into a reactive object
B. To create reactive references for all properties of a reactive object
C. To create a reactive reference to a single property of a reactive object
D. To make a reactive object readonly
Solution
Step 1: Understand what toRef does
toRef creates a reactive reference to a single property inside a reactive object, keeping reactivity when destructuring.
Step 2: Compare with other options
toRefs creates refs for all properties, not just one. The other options describe different functions.
Final Answer:
To create a reactive reference to a single property of a reactive object -> Option C
Quick Check:
toRef = single property ref [OK]
Hint: toRef = one property ref, toRefs = all properties refs [OK]
Common Mistakes:
Confusing toRef with toRefs
Thinking toRef creates refs for all properties
Assuming toRef converts refs to reactive objects
2. Which of the following is the correct syntax to destructure a reactive object state using toRefs?
easy
A. const { count, name } = toRef(state)
B. const { count, name } = toRefs(state)
C. const [count, name] = toRefs(state)
D. const count = toRefs(state).count
Solution
Step 1: Recall the syntax of toRefs
toRefs returns an object with refs for each property, so destructuring with curly braces is correct.
Step 2: Analyze each option
const { count, name } = toRef(state) uses toRef which returns a single ref, so destructuring multiple properties is invalid. const [count, name] = toRefs(state) uses array destructuring which is wrong. const count = toRefs(state).count accesses a property but does not destructure.
Final Answer:
const { count, name } = toRefs(state) -> Option B
Quick Check:
toRefs returns object of refs, use object destructuring [OK]
Hint: Use curly braces {} with toRefs for object destructuring [OK]
Common Mistakes:
Using toRef instead of toRefs for multiple properties
Using array destructuring with toRefs
Not destructuring and accessing properties directly
Increasing count.value by 1 changes state.count to 1, so logging state.count outputs 1.
Final Answer:
1 -> Option D
Quick Check:
toRefs keeps reactivity, so state.count = 1 [OK]
Hint: toRefs keeps reactivity; changing ref updates original object [OK]
Common Mistakes:
Thinking destructured refs are copies, not reactive
Forgetting to use .value to update ref
Expecting original state to stay unchanged
4. What is wrong with this code snippet?
const state = reactive({ count: 0 })
const { count } = state
count.value++
medium
A. You cannot destructure reactive objects directly without toRefs or toRef
B. count.value++ is invalid syntax
C. reactive objects cannot have numeric properties
D. count is not reactive because reactive() was not called
Solution
Step 1: Identify destructuring issue
Destructuring state directly extracts the raw value, losing reactivity. count is not a ref here.
Step 2: Understand why count.value++ fails
Since count is a plain value, it has no .value property, so this causes an error.
Final Answer:
You cannot destructure reactive objects directly without toRefs or toRef -> Option A
Quick Check:
Destructure reactive with toRefs/toRef to keep reactivity [OK]
Hint: Always use toRefs or toRef when destructuring reactive objects [OK]
Common Mistakes:
Destructuring reactive objects directly
Using .value on non-ref values
Assuming reactive() makes properties refs automatically
5. You have a reactive object user with properties firstName and lastName. You want to destructure these properties but keep them reactive and also create a computed property fullName that updates when either changes. Which approach correctly achieves this?