Bird
Raised Fist0
Vueframework~20 mins

Provide and inject for deep passing in Vue - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Vue Provide/Inject Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What will the nested component display?
Consider a Vue 3 app using provide in a parent and inject in a deeply nested child. What text will the DeepChild component render?
Vue
/* Parent.vue */
<template>
  <Child />
</template>
<script setup>
import { provide } from 'vue'
import Child from './Child.vue'
provide('message', 'Hello from Parent')
</script>

/* Child.vue */
<template>
  <DeepChild />
</template>
<script setup>
import DeepChild from './DeepChild.vue'
</script>

/* DeepChild.vue */
<template>
  <p>{{ injectedMessage }}</p>
</template>
<script setup>
import { inject } from 'vue'
const injectedMessage = inject('message', 'Default message')
</script>
AHello from Parent
BDefault message
Cundefined
DError: injection not found
Attempts:
2 left
💡 Hint
Remember that provide/inject works across multiple nested components if the key matches.
❓ state_output
intermediate
2:00remaining
What is the output after updating the provided value?
Given a parent component that provides a reactive object, and a nested child that injects and displays a property, what will the child show after the parent updates the property?
Vue
/* Parent.vue */
<template>
  <Child />
  <button @click="updateMessage">Change Message</button>
</template>
<script setup>
import { reactive, provide } from 'vue'
import Child from './Child.vue'
const state = reactive({ message: 'Initial' })
provide('state', state)
function updateMessage() {
  state.message = 'Updated'
}
</script>

/* Child.vue */
<template>
  <p>{{ state.message }}</p>
</template>
<script setup>
import { inject } from 'vue'
const state = inject('state')
</script>
AShows Updated immediately on load
BInitial, then changes to Updated after button click
CAlways shows Initial, does not update
DError: state is undefined
Attempts:
2 left
💡 Hint
Reactive objects provided are shared and updates reflect in injected components.
📝 Syntax
advanced
2:00remaining
Which option correctly provides and injects a value for deep passing?
Identify the correct syntax to provide a value in a parent and inject it in a nested child component in Vue 3 Composition API.
AParent: provide('key', value); Child: const val = inject('key')
BParent: provide = ('key', value); Child: const val = inject('key')
CParent: provide('key', value); Child: const val = inject('key', defaultValue)
DParent: provide('key', value); Child: const val = inject()
Attempts:
2 left
💡 Hint
Inject can accept a default value to avoid undefined if the key is missing.
🔧 Debug
advanced
2:00remaining
Why does the injected value show undefined in the nested child?
A developer uses provide in a parent and inject in a nested child, but the injected value is undefined. What is the most likely cause?
Vue
/* Parent.vue */
<script setup>
import { provide } from 'vue'
provide('data', 'Hello')
</script>

/* DeepChild.vue */
<script setup>
import { inject } from 'vue'
const data = inject('data')
console.log(data) // undefined
</script>
AAll of the above
BThe inject key does not match the provide key
CThe child component is not a descendant of the provider
DThe provide call is outside the setup function or lifecycle, so it runs too early
Attempts:
2 left
💡 Hint
Check provide location, key names, and component hierarchy.
🧠 Conceptual
expert
3:00remaining
How does Vue's provide/inject mechanism support deep passing without prop drilling?
Explain why provide/inject is useful for passing data deeply in a component tree compared to props, and what limitations it has.
AProvide/inject is a global state management system that replaces Vuex.
BProvide/inject automatically makes all data reactive and replaces the need for props entirely.
CProvide/inject only works for immediate children and cannot pass data deeply.
DProvide/inject allows passing data directly to any descendant without intermediate props, but it is not reactive by default and should be used sparingly.
Attempts:
2 left
💡 Hint
Think about how provide/inject avoids passing props through many layers and its reactivity behavior.

Practice

(1/5)
1. What is the main purpose of provide and inject in Vue?
easy
A. To replace Vuex for state management in all cases.
B. To share data deeply between ancestor and descendant components without passing props.
C. To handle component lifecycle hooks automatically.
D. To style components globally using CSS variables.

Solution

  1. Step 1: Understand the role of provide and inject

    Provide and inject allow passing data from an ancestor component to any descendant without manually passing props through each intermediate component.
  2. Step 2: Compare with other options

    Vuex is a separate state management tool, lifecycle hooks handle component events, and CSS variables style components; none of these are the main purpose of provide/inject.
  3. Final Answer:

    To share data deeply between ancestor and descendant components without passing props. -> Option B
  4. Quick Check:

    Provide/inject = deep data sharing [OK]
Hint: Remember: provide/inject skips prop drilling [OK]
Common Mistakes:
  • Thinking provide/inject replaces Vuex completely
  • Confusing provide/inject with lifecycle hooks
  • Assuming provide/inject is for styling
2. Which of the following is the correct way to use provide in a Vue 3 setup function?
easy
A. provide('key', 'value')
B. provide: { key: 'value' }
C. this.provide = { key: 'value' }
D. const provide = { key: 'value' }

Solution

  1. Step 1: Recall provide usage in setup()

    In Vue 3 setup, provide is a function imported from 'vue' and called as provide('key', value).
  2. Step 2: Check other options

    const provide = { key: 'value' } is an object, not a function call; this.provide = { key: 'value' } uses this which is not available in setup; provide: { key: 'value' } is invalid syntax.
  3. Final Answer:

    provide('key', 'value') -> Option A
  4. Quick Check:

    Provide is a function call in setup [OK]
Hint: Use provide('key', value) inside setup() [OK]
Common Mistakes:
  • Trying to assign provide as an object
  • Using this inside setup()
  • Confusing provide option with function call
3. Given this Vue 3 code snippet, what will be logged in the child component?
import { provide, inject } from 'vue';

export default {
  setup() {
    provide('color', 'blue');
  }
}

// In child component
export default {
  setup() {
    const color = inject('color');
    console.log(color);
  }
}
medium
A. 'blue'
B. undefined
C. null
D. An error is thrown

Solution

  1. Step 1: Understand provide and inject behavior

    The ancestor provides the key 'color' with value 'blue'. The child injects 'color', so it receives 'blue'.
  2. Step 2: Confirm no default value or errors

    Since 'color' is provided, inject returns 'blue', not undefined or null, and no error occurs.
  3. Final Answer:

    'blue' -> Option A
  4. Quick Check:

    Inject returns provided value 'blue' [OK]
Hint: Inject returns provided value if key matches [OK]
Common Mistakes:
  • Expecting undefined if not passed as prop
  • Assuming inject returns null by default
  • Thinking inject throws error if key missing
4. Identify the error in this Vue 3 code using provide/inject:
export default {
  setup() {
    provide = { theme: 'dark' };
  }
}

export default {
  setup() {
    const theme = inject('theme');
    return { theme };
  }
}
medium
A. The key 'theme' is not provided properly because it is misspelled.
B. inject is missing a default value.
C. provide is incorrectly assigned as an object instead of called as a function.
D. setup() cannot return reactive data.

Solution

  1. Step 1: Check provide usage

    Provide must be called as a function: provide('key', value). Here, provide is assigned an object, which is invalid.
  2. Step 2: Verify other options

    Inject default value is optional; key spelling matches; setup can return reactive data.
  3. Final Answer:

    provide is incorrectly assigned as an object instead of called as a function. -> Option C
  4. Quick Check:

    Provide must be called, not assigned [OK]
Hint: Provide is a function call, not an object assignment [OK]
Common Mistakes:
  • Assigning provide as an object instead of calling it
  • Thinking inject requires default value always
  • Confusing setup return rules
5. You want to share a reactive theme object deeply across many nested components using provide/inject. Which approach correctly ensures reactivity is preserved in descendants?
hard
A. Provide a reactive object but inject a copy using { ...injected } to avoid mutation.
B. Provide a plain object and inject it, then wrap it with reactive() in each child.
C. Provide a ref with the reactive object and inject the ref, then use .value in children.
D. Provide a reactive object using reactive() and inject it directly.

Solution

  1. Step 1: Understand reactivity with provide/inject

    Provide a reactive object created with reactive() and inject it directly. Vue automatically ensures the injected value is deeply reactive in descendants.
  2. Step 2: Analyze other options

    Provide a plain object and inject it, then wrap it with reactive() in each child. uses a plain object (no reactivity) and re-wrapping creates separate instances. Provide a ref with the reactive object and inject the ref, then use .value in children. unnecessarily wraps a reactive object in a ref, adding extra complexity with .value. Provide a reactive object but inject a copy using { ...injected } to avoid mutation. copies the object, breaking the reactivity connection.
  3. Final Answer:

    Provide a reactive object using reactive() and inject it directly. -> Option D
  4. Quick Check:

    reactive() object + direct provide/inject = preserved reactivity [OK]
Hint: Provide reactive({}) directly and inject without .value [OK]
Common Mistakes:
  • Injecting plain objects and expecting reactivity
  • Wrapping injected objects again with reactive
  • Copying objects and losing reactivity
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard