Bird
Raised Fist0
Vueframework~20 mins

Defining state in stores in Vue - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Vue Store State Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
How does the state update in a Vue store?

Consider a Vue store defined with reactive state. What happens when you update a property inside the state object?

Vue
import { reactive } from 'vue';

const store = {
  state: reactive({ count: 0 })
};

function increment() {
  store.state.count++;
}

increment();
console.log(store.state.count);
AThe state count throws an error because reactive cannot be used in stores.
BThe state count updates to 1 and any component using it re-renders.
CThe state count updates to 1 but components do not re-render automatically.
DThe state count remains 0 because reactive objects are immutable.
Attempts:
2 left
💡 Hint

Think about how Vue's reactive function tracks changes.

📝 Syntax
intermediate
1:30remaining
Identify the correct way to define state in a Vue store

Which of the following correctly defines a reactive state object inside a Vue store?

Aconst state = reactive user: null };
Bconst state = ref({ user: null });
Cconst state = reactive([{ user: null }]);
Dconst state = reactive({ user: null });
Attempts:
2 left
💡 Hint

Remember the syntax for reactive requires an object inside parentheses.

🔧 Debug
advanced
2:30remaining
Why does this Vue store state not update the component?

Given this store code, why does the component not update when state.count changes?

Vue
import { reactive } from 'vue';

const state = { count: 0 };

function increment() {
  state.count++;
}

export default { state, increment };
ABecause the increment function is not called inside a Vue lifecycle hook.
BBecause <code>count</code> is a number and numbers cannot be reactive.
CBecause <code>state</code> is not reactive; it should be wrapped with <code>reactive()</code>.
DBecause the store must use <code>ref</code> instead of <code>reactive</code>.
Attempts:
2 left
💡 Hint

Check how the state object is created and if Vue can track its changes.

❓ state_output
advanced
2:00remaining
What is the value of state after these mutations?

Given this Vue store code, what is the final value of state.items?

Vue
import { reactive } from 'vue';

const state = reactive({ items: [] });

function addItem(item) {
  state.items.push(item);
}

addItem('apple');
addItem('banana');
state.items = ['orange'];
A['orange']
B['apple', 'banana']
C['apple', 'banana', 'orange']
D[]
Attempts:
2 left
💡 Hint

Consider what happens when you assign a new array to a reactive property.

🧠 Conceptual
expert
3:00remaining
Why use a function to define state in Vue stores?

In Vue 3 stores, why is it recommended to define the state as a function returning an object instead of a plain object?

ATo ensure each store instance has its own independent reactive state, avoiding shared state bugs.
BBecause Vue requires all state to be functions for reactivity to work.
CTo improve performance by caching the state object across components.
DBecause functions automatically make the state deeply reactive.
Attempts:
2 left
💡 Hint

Think about what happens if multiple components use the same store instance.

Practice

(1/5)
1. What is the correct way to define the state in a Vue store using defineStore?
easy
A. Define state as an array of values.
B. Define state as a plain object directly.
C. Define state as a function that returns an object.
D. Define state as a string representing JSON.

Solution

  1. Step 1: Understand Vue store state definition

    Vue stores require state to be a function returning an object to avoid shared state across instances.
  2. Step 2: Compare options with Vue pattern

    Only defining state as a function returning an object matches Vue's recommended pattern.
  3. Final Answer:

    Define state as a function that returns an object. -> Option C
  4. Quick Check:

    State = function returning object [OK]
Hint: State must be a function returning an object in Vue stores [OK]
Common Mistakes:
  • Defining state as a plain object causes shared state bugs
  • Using arrays or strings instead of objects for state
  • Forgetting to return the object from the state function
2. Which of the following is the correct syntax to define a store named 'user' with a state containing a 'name' property initialized to an empty string?
easy
A. const useUserStore = defineStore({ id: 'user', state: () => ({ name: '' }) })
B. const useUserStore = defineStore('user', { state: { name: '' } })
C. const useUserStore = defineStore('user', () => ({ name: '' }))
D. const useUserStore = defineStore('user', { state: () => ({ name: '' }) })

Solution

  1. Step 1: Recall defineStore syntax

    The first argument is the store id string, the second is an object with a state function returning the state object.
  2. Step 2: Check each option

    const useUserStore = defineStore('user', { state: () => ({ name: '' }) }) correctly uses defineStore with id 'user' and state as a function returning { name: '' }.
  3. Final Answer:

    const useUserStore = defineStore('user', { state: () => ({ name: '' }) }) -> Option D
  4. Quick Check:

    defineStore(id, { state: () => ({}) }) [OK]
Hint: Use defineStore('id', { state: () => ({}) }) syntax [OK]
Common Mistakes:
  • Defining state as an object instead of a function
  • Passing state function as the second argument directly
  • Using an object with 'id' property instead of string id
3. Given the following store definition, what will be the initial value of store.count after calling const store = useCounterStore()?
const useCounterStore = defineStore('counter', {
  state: () => ({ count: 10 })
})
medium
A. 10
B. 0
C. null
D. undefined

Solution

  1. Step 1: Analyze the state function

    The state function returns an object with count initialized to 10.
  2. Step 2: Understand store instance value

    When useCounterStore() is called, it creates a store instance with count set to 10 as initial state.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Initial count = 10 [OK]
Hint: State function returns initial values used in store instance [OK]
Common Mistakes:
  • Assuming count defaults to 0 if not explicitly set
  • Confusing state function with plain object
  • Expecting undefined because of missing initialization
4. Identify the error in this store definition:
const useTodoStore = defineStore('todo', {
  state: {
    todos: []
  }
})
medium
A. The todos array should be initialized outside the state.
B. State must be a function returning an object, not an object directly.
C. The store id 'todo' must be an object, not a string.
D. The defineStore function requires no arguments.

Solution

  1. Step 1: Check state definition format

    State must be a function returning an object to avoid shared state across instances.
  2. Step 2: Identify the error

    The code defines state as an object directly, which is incorrect.
  3. Final Answer:

    State must be a function returning an object, not an object directly. -> Option B
  4. Quick Check:

    State = function returning object, not plain object [OK]
Hint: State must always be a function returning an object [OK]
Common Mistakes:
  • Defining state as a plain object causes shared state bugs
  • Misunderstanding store id type requirements
  • Incorrect usage of defineStore arguments
5. You want to create a store that holds a list of users and a method to add a new user. Which is the correct way to define the state and actions in defineStore?
hard
A. defineStore('users', { state: () => ({ users: [] }), actions: { addUser(user) { this.users.push(user) } } })
B. defineStore('users', { state: { users: [] }, methods: { addUser(user) { this.users.push(user) } } })
C. defineStore('users', () => ({ users: [], addUser(user) { this.users.push(user) } }))
D. defineStore('users', { state: () => ({ users: [] }), addUser(user) { this.users.push(user) } })

Solution

  1. Step 1: Define state as a function returning an object

    The state must be a function returning an object with users array.
  2. Step 2: Define actions inside the actions property

    Actions are methods inside the actions object to modify state safely.
  3. Step 3: Verify correct syntax

    defineStore('users', { state: () => ({ users: [] }), actions: { addUser(user) { this.users.push(user) } } }) correctly defines state as a function and actions as an object with addUser method.
  4. Final Answer:

    defineStore('users', { state: () => ({ users: [] }), actions: { addUser(user) { this.users.push(user) } } }) -> Option A
  5. Quick Check:

    State function + actions object = correct store [OK]
Hint: Put actions inside 'actions' object, state as function [OK]
Common Mistakes:
  • Defining state as an object instead of a function
  • Placing methods outside the actions property
  • Using 'methods' instead of 'actions' in defineStore
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