Bird
Raised Fist0
Vueframework~20 mins

Composable with lifecycle hooks in Vue - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Vue Composable Lifecycle Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when the composable's onMounted hook runs?

Consider this Vue 3 composable using onMounted:

import { ref, onMounted } from 'vue'

export function useTimer() {
  const count = ref(0)
  onMounted(() => {
    count.value = 5
  })
  return { count }
}

If a component uses useTimer(), what will count.value be immediately after the component mounts?

A5
B0
Cundefined
DAn error occurs because <code>onMounted</code> is used outside setup
Attempts:
2 left
💡 Hint

Remember that onMounted runs after the component is mounted, so the value changes then.

❓ state_output
intermediate
2:00remaining
What is the value of message after the composable's onUnmounted hook runs?

Given this composable:

import { ref, onUnmounted } from 'vue'

export function useMessage() {
  const message = ref('Hello')
  onUnmounted(() => {
    message.value = 'Goodbye'
  })
  return { message }
}

If a component uses useMessage() and then unmounts, what will message.value be?

Aundefined
B'Hello'
CAn error because you cannot change state in onUnmounted
D'Goodbye'
Attempts:
2 left
💡 Hint

Think about when onUnmounted runs and if state can be changed then.

📝 Syntax
advanced
2:00remaining
Which option correctly uses onBeforeUnmount inside a composable?

Choose the option that correctly registers a cleanup function with onBeforeUnmount in a Vue 3 composable.

A
import { onBeforeUnmount } from 'vue'

export function useCleanup() {
  onBeforeUnmount = () =&gt; {
    console.log('Cleaning up')
  }
}
B
import { onBeforeUnmount } from 'vue'

export function useCleanup() {
  onBeforeUnmount(() =&gt; {
    console.log('Cleaning up')
  })
}
C
import { onBeforeUnmount } from 'vue'

export function useCleanup() {
  onBeforeUnmount(() =&gt; {
    console.log('Cleaning up')
  })()
}
D
import { onBeforeUnmount } from 'vue'

export function useCleanup() {
  onBeforeUnmount(() =&gt; {
    console.log('Cleaning up')
  }
}
Attempts:
2 left
💡 Hint

Remember onBeforeUnmount is a function you call with a callback.

🔧 Debug
advanced
2:00remaining
Why does this composable's onMounted hook not run?

Look at this composable:

import { ref, onMounted } from 'vue'

export function useData() {
  const data = ref(null)
  onMounted(() => {
    data.value = 'Loaded'
  })
  return { data }
}

But when used in a component, data.value stays null. What is the likely cause?

AThe <code>onMounted</code> hook runs too early before the component mounts
BThe <code>ref</code> is not reactive, so changes don't update
CThe composable is called outside the component's setup function, so lifecycle hooks don't run
DThe composable must return a function to trigger <code>onMounted</code>
Attempts:
2 left
💡 Hint

Lifecycle hooks only work inside component setup or other lifecycle hooks.

🧠 Conceptual
expert
2:00remaining
What is the main benefit of using lifecycle hooks inside composables?

Why do Vue developers use lifecycle hooks like onMounted inside composables instead of only inside components?

ATo reuse lifecycle-dependent logic across multiple components easily
BTo force components to mount earlier than usual
CTo prevent components from unmounting automatically
DTo replace the component's own lifecycle hooks completely
Attempts:
2 left
💡 Hint

Think about how composables help organize code.

Practice

(1/5)
1. What is the main purpose of using lifecycle hooks inside a Vue composable?
easy
A. To run code automatically when a component starts or stops
B. To define the component's template structure
C. To style the component with CSS
D. To create new Vue components

Solution

  1. Step 1: Understand lifecycle hooks role

    Lifecycle hooks let you run code at specific times in a component's life, like when it starts or stops.
  2. Step 2: Connect lifecycle hooks with composables

    Using lifecycle hooks inside composables allows shared logic to run automatically when components use the composable.
  3. Final Answer:

    To run code automatically when a component starts or stops -> Option A
  4. Quick Check:

    Lifecycle hooks run code at component start/stop = A [OK]
Hint: Lifecycle hooks run code on component start or cleanup [OK]
Common Mistakes:
  • Thinking lifecycle hooks define templates
  • Confusing styling with lifecycle hooks
  • Believing composables create components
2. Which of the following is the correct way to import and use the onMounted lifecycle hook inside a Vue 3 composable?
easy
A. import { onMounted } from 'vue'; onMounted = () => { /* code */ };
B. import onMounted from 'vue'; onMounted(() => { /* code */ });
C. import { onMounted } from 'vue'; onMounted(() => { /* code */ });
D. import { onMounted } from 'vue'; onMounted.function(() => { /* code */ });

Solution

  1. Step 1: Check import syntax

    Vue lifecycle hooks like onMounted are named exports, so use curly braces in import.
  2. Step 2: Check usage syntax

    onMounted is a function that takes a callback, so call it with a function argument.
  3. Final Answer:

    import { onMounted } from 'vue'; onMounted(() => { /* code */ }); -> Option C
  4. Quick Check:

    Correct import and call syntax = A [OK]
Hint: Use curly braces to import lifecycle hooks from 'vue' [OK]
Common Mistakes:
  • Importing without curly braces
  • Assigning onMounted to a function instead of calling it
  • Using incorrect method like onMounted.function
3. Given this composable code, what will be logged when a component using it is mounted?
import { ref, onMounted } from 'vue';
export function useLogger() {
  const message = ref('Hello');
  onMounted(() => {
    console.log(message.value);
  });
  return { message };
}
medium
A. Hello
B. undefined
C. null
D. An error is thrown

Solution

  1. Step 1: Understand ref initialization

    The message ref is initialized with the string 'Hello'.
  2. Step 2: Check onMounted callback

    When the component mounts, the callback logs message.value, which is 'Hello'.
  3. Final Answer:

    Hello -> Option A
  4. Quick Check:

    Ref value logged on mount = B [OK]
Hint: Ref values accessed with .value inside lifecycle hooks [OK]
Common Mistakes:
  • Logging ref without .value
  • Expecting undefined before mount
  • Thinking onMounted runs before ref initialization
4. Identify the error in this composable using lifecycle hooks:
import { onMounted, onUnmounted } from 'vue';
export function useTimer() {
  let timer = null;
  onMounted(() => {
    timer = setInterval(() => console.log('tick'), 1000);
  });
  onUnmounted(() => {
    clearInterval(timer);
  });
  return {};
}
medium
A. timer should be a ref to persist between hooks
B. onUnmounted should be onBeforeUnmount
C. setInterval callback syntax is wrong
D. No error, code works correctly

Solution

  1. Step 1: Check variable scope and usage

    Variable timer is declared in composable scope and updated in onMounted, accessible in onUnmounted.
  2. Step 2: Verify lifecycle hooks usage

    onMounted sets interval, onUnmounted clears it correctly to avoid memory leaks.
  3. Final Answer:

    No error, code works correctly -> Option D
  4. Quick Check:

    Proper timer setup and cleanup = D [OK]
Hint: Variables in composable scope persist across lifecycle hooks [OK]
Common Mistakes:
  • Thinking timer must be a ref
  • Confusing onUnmounted with onBeforeUnmount
  • Misunderstanding setInterval callback syntax
5. You want to create a composable that fetches data when a component mounts and cancels the fetch if the component unmounts before completion. Which lifecycle hooks and pattern should you use inside the composable?
hard
A. Use onUnmounted to start fetch and onMounted to abort fetch
B. Use onMounted to start fetch and onUnmounted to abort fetch with an AbortController
C. Use onBeforeMount to start fetch and onMounted to abort fetch
D. Use onMounted to start fetch and no cleanup is needed

Solution

  1. Step 1: Determine when to start fetch

    Fetching data should start when the component is fully mounted, so use onMounted.
  2. Step 2: Handle cleanup on unmount

    To cancel fetch if component unmounts early, use onUnmounted to abort the fetch using an AbortController.
  3. Final Answer:

    Use onMounted to start fetch and onUnmounted to abort fetch with an AbortController -> Option B
  4. Quick Check:

    Fetch start on mount, abort on unmount = C [OK]
Hint: Start fetch on mount, abort on unmount with AbortController [OK]
Common Mistakes:
  • Starting fetch too early or too late
  • Not aborting fetch on unmount causing leaks
  • Using wrong lifecycle hooks for cleanup
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