Bird
Raised Fist0
Vueframework~20 mins

Composable vs mixin comparison in Vue - Practice Questions

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Vue Composable vs Mixin Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Key difference between composables and mixins in Vue 3
Which statement best describes a key difference between composables and mixins in Vue 3?
AMixins are only usable in Vue 2; composables are exclusive to Vue 3 and cannot be used in Vue 2.
BComposables require class-based components; mixins work only with functional components.
CComposables automatically merge component templates; mixins only merge JavaScript logic.
DMixins merge data and methods into components causing potential naming conflicts; composables return reusable logic without merging, avoiding conflicts.
Attempts:
2 left
💡 Hint
Think about how data and methods are combined in components.
❓ component_behavior
intermediate
2:00remaining
Output of component using mixin vs composable
Given the following Vue 3 component code, what will be the rendered output?
Vue
import { ref } from 'vue';

const useCounter = () => {
  const count = ref(0);
  const increment = () => count.value++;
  return { count, increment };
};

const counterMixin = {
  data() {
    return { count: 0 };
  },
  methods: {
    increment() {
      this.count++;
    }
  }
};

export default {
  name: 'TestComponent',
  mixins: [counterMixin],
  setup() {
    const { count: compCount, increment: compIncrement } = useCounter();
    return { compCount, compIncrement };
  },
  template: `<div>
    <p>Mixin count: {{ count }}</p>
    <button @click="compIncrement">Increment</button>
  </div>`
};
A<div><p>Mixin count: 0</p><button>Increment</button></div> and clicking button increments both mixin and composable counts
B<div><p>Mixin count: 0</p><button>Increment</button></div> and clicking button increments composable count but not displayed
C<div><p>Mixin count: 0</p><button>Increment</button></div> but clicking button causes error due to conflict
D<div><p>Mixin count: 0</p><button>Increment</button></div> and clicking button increments mixin count displayed
Attempts:
2 left
💡 Hint
Consider which count is displayed and which increment function is called.
❓ lifecycle
advanced
2:00remaining
Lifecycle hook behavior in mixins vs composables
In Vue 3, how do lifecycle hooks behave differently when used inside mixins compared to composables?
AMixin lifecycle hooks are merged and called automatically; composable lifecycle hooks must be called inside setup() explicitly.
BComposable lifecycle hooks run before mixin hooks; mixin hooks run only once per app.
CMixin lifecycle hooks are ignored in Vue 3; only composable hooks run.
DComposable lifecycle hooks are merged like mixins but require manual registration.
Attempts:
2 left
💡 Hint
Think about how lifecycle hooks are declared and triggered in each pattern.
📝 Syntax
advanced
2:00remaining
Identify the syntax error in this mixin usage
What is the syntax error in the following Vue 3 component using a mixin?
const myMixin = {
  data() {
    return {
      message: 'Hello'
    }
  },
  methods: {
    greet() {
      console.log(this.message)
    }
  }
}

export default {
  name: 'MyComponent',
  mixins: myMixin,
  template: ``
}
Amethods must be declared inside setup() in Vue 3
Bdata() must be a function returning a function, not an object
Cmixins should be an array, so it should be mixins: [myMixin]
Dtemplate must be a separate .vue file, not inline string
Attempts:
2 left
💡 Hint
Check the type expected for the mixins option.
🔧 Debug
expert
3:00remaining
Debugging reactive state sharing issue between composables
Two components import the same composable which returns a reactive object. Both components modify the reactive object but changes do not reflect across components. Why?
Vue
export function useSharedState() {
  const state = reactive({ count: 0 });
  const increment = () => { state.count++ };
  return { state, increment };
}

// Component A and Component B both import and call useSharedState() separately
AEach component calls useSharedState() creating separate reactive objects; state is not shared.
BReactive objects cannot be shared between components in Vue 3.
CThe reactive object must be wrapped in ref() to share state.
DThe composable must be registered globally to share state.
Attempts:
2 left
💡 Hint
Consider how functions returning reactive objects behave when called multiple times.

Practice

(1/5)
1. Which statement best describes the main difference between a mixin and a composable in Vue?
easy
A. Mixins are functions, and composables use Vue options like data and methods.
B. Composables are only used in Vue 2, mixins only in Vue 3.
C. Mixins and composables are exactly the same in Vue.
D. Mixins use Vue options like data and methods, while composables are functions using the Composition API.

Solution

  1. Step 1: Understand mixin structure

    Mixins use Vue's Options API with properties like data, methods, and lifecycle hooks.
  2. Step 2: Understand composable structure

    Composables are plain functions that use Vue's Composition API to share reactive logic.
  3. Final Answer:

    Mixins use Vue options like data and methods, while composables are functions using the Composition API. -> Option D
  4. Quick Check:

    Mixin = Options API, Composable = Composition API [OK]
Hint: Mixins use options; composables are functions with Composition API [OK]
Common Mistakes:
  • Confusing mixins as functions
  • Thinking composables use Options API
  • Believing mixins and composables are identical
2. Which of the following is the correct syntax to define a composable function in Vue 3?
easy
A. function useCounter() { this.count = 0; }
B. export function useCounter() { const count = ref(0); return { count }; }
C. export default { methods: { useCounter() { return 0; } } }
D. export const useCounter = { data() { return { count: 0 }; } }

Solution

  1. Step 1: Identify composable function pattern

    Composable functions are plain functions that return reactive state or methods, often prefixed with 'use'.
  2. Step 2: Check syntax correctness

    export function useCounter() { const count = ref(0); return { count }; } defines a function returning a reactive ref, which matches composable pattern.
  3. Final Answer:

    export function useCounter() { const count = ref(0); return { count }; } -> Option B
  4. Quick Check:

    Composable = function returning reactive state [OK]
Hint: Composable is a function returning reactive refs or state [OK]
Common Mistakes:
  • Using object syntax instead of function
  • Not returning reactive state
  • Using 'this' inside composable function
3. Given this mixin and component code, what will be logged when the button is clicked?
const myMixin = {
  data() { return { count: 0 }; },
  methods: { increment() { this.count++; console.log(this.count); } }
}

export default {
  mixins: [myMixin],
  template: `Click`
}
medium
A. Logs 1, 2, 3 on each click
B. Logs 0 every time
C. Throws an error because count is undefined
D. Logs NaN on each click

Solution

  1. Step 1: Understand mixin data and methods

    The mixin provides a reactive count starting at 0 and an increment method that increases count and logs it.
  2. Step 2: Check component usage

    The component uses the mixin, so count and increment are available. Each click calls increment, increasing count by 1 and logging it.
  3. Final Answer:

    Logs 1, 2, 3 on each click -> Option A
  4. Quick Check:

    Mixin data + method increments count [OK]
Hint: Mixin data is reactive and shared in component [OK]
Common Mistakes:
  • Assuming count resets each click
  • Thinking count is undefined
  • Confusing mixin with composable behavior
4. Identify the error in this composable usage inside a Vue component:
import { ref } from 'vue';

function useTimer() {
  const time = ref(0);
  setInterval(() => time.value++, 1000);
  return { time };
}

export default {
  setup() {
    const timer = useTimer;
    return { timer };
  },
  template: `
{{ timer.time }}
` }
medium
A. setInterval should be inside setup, not composable
B. ref is not imported correctly
C. The composable function is not called; should be useTimer()
D. template syntax is invalid

Solution

  1. Step 1: Check composable invocation

    The composable useTimer is assigned without parentheses, so timer is a function reference, not the returned object.
  2. Step 2: Understand impact on template

    Since timer is a function, accessing timer.time is undefined, causing template to fail or show nothing.
  3. Final Answer:

    The composable function is not called; should be useTimer() -> Option C
  4. Quick Check:

    Call composable as function: useTimer() [OK]
Hint: Call composable with () to get returned state [OK]
Common Mistakes:
  • Forgetting parentheses when calling composable
  • Moving setInterval outside composable unnecessarily
  • Misreading template syntax
5. You want to share reactive state and methods between multiple components in Vue 3. Which approach is better and why?

Choose the best option and explain why.
hard
A. Composables share reactive logic clearly and safely with better TypeScript support.
B. Mixins share data and methods but can cause naming conflicts and unclear code.
C. Copy-pasting code is simple but leads to maintenance problems.
D. Global variables break reactivity and make debugging hard.

Solution

  1. Step 1: Evaluate mixins drawbacks

    Mixins can cause naming conflicts and make code harder to understand because they merge properties invisibly.
  2. Step 2: Evaluate composables benefits

    Composables are explicit functions that return reactive state and methods, improving clarity, reusability, and TypeScript support.
  3. Step 3: Consider other options

    Copy-pasting duplicates code, and global variables break Vue's reactivity system.
  4. Final Answer:

    Composables share reactive logic clearly and safely with better TypeScript support. -> Option A
  5. Quick Check:

    Composable = clear, safe, reusable logic [OK]
Hint: Prefer composables for clear, reusable reactive logic [OK]
Common Mistakes:
  • Choosing mixins despite conflicts
  • Ignoring reactivity with global variables
  • Thinking copy-paste is maintainable
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