Bird
Raised Fist0
Vueframework~8 mins

v-for for list rendering in Vue - Performance & Optimization

Choose your learning style10 modes available
Performance: v-for for list rendering
MEDIUM IMPACT
This affects how quickly the browser can render lists and update the DOM when data changes.
Rendering a list of items in Vue using v-for
Vue
<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script setup>
const items = Array.from({ length: 1000 }, (_, i) => ({ id: i, name: `Item ${i}` }));
</script>
Using a unique :key helps Vue track items efficiently, minimizing DOM updates and reflows.
📈 Performance GainReduces reflows to only changed items, cutting rendering time by 80% or more.
Rendering a list of items in Vue using v-for
Vue
<template>
  <ul>
    <li v-for="item in items">{{ item.name }}</li>
  </ul>
</template>

<script setup>
const items = Array(1000).fill({ name: 'Item' });
</script>
Rendering a large list without a unique key causes Vue to re-render all items on any change, triggering many DOM updates and reflows.
📉 Performance CostTriggers 1000 reflows on each update, blocking rendering for 100+ ms on slow devices.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
v-for without keyCreates all nodes every updateTriggers reflow for every itemHigh paint cost due to full re-render[X] Bad
v-for with unique keyUpdates only changed nodesMinimal reflows on updateLower paint cost[OK] Good
v-for with virtual scrollingCreates only visible nodesVery few reflowsMinimal paint cost[OK] Good
Rendering Pipeline
v-for creates DOM nodes for each item. Without keys, Vue re-renders entire lists causing many Layout and Paint steps. With keys, Vue patches only changed nodes, reducing Layout and Paint. Large lists increase Style Calculation and Layout time. Virtual scrolling limits nodes to visible ones, minimizing all stages.
→Style Calculation
→Layout
→Paint
→Composite
⚠️ BottleneckLayout and Paint stages due to many DOM nodes and reflows
Core Web Vital Affected
LCP
This affects how quickly the browser can render lists and update the DOM when data changes.
Optimization Tips
1Always use a unique :key with v-for to help Vue optimize DOM updates.
2Avoid rendering very large lists all at once; use virtual scrolling or pagination.
3Check performance in DevTools to spot costly reflows and paints during list rendering.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance benefit of adding a unique :key to v-for list items?
AIt helps Vue track items and update only changed DOM nodes
BIt reduces the number of items in the list
CIt disables reflows completely
DIt compresses the JavaScript bundle size
DevTools: Performance
How to check: Record a performance profile while interacting with the list. Look for long scripting and rendering tasks during list updates.
What to look for: High Layout and Paint times indicate inefficient list rendering. Lower times with keys or virtual scrolling confirm better performance.

Practice

(1/5)
1. What does the v-for directive do in Vue.js?
easy
A. It repeats an element or component for each item in a list.
B. It conditionally shows or hides an element.
C. It binds a value to an input element.
D. It listens for user events like clicks.

Solution

  1. Step 1: Understand the purpose of v-for

    The v-for directive is used to loop over arrays or objects and render elements multiple times.
  2. Step 2: Compare with other directives

    Other directives like v-if control visibility, v-bind binds data, and v-on listens to events, so they do not repeat elements.
  3. Final Answer:

    It repeats an element or component for each item in a list. -> Option A
  4. Quick Check:

    v-for = repeat elements [OK]
Hint: Remember: v-for means 'for each' in a list [OK]
Common Mistakes:
  • Confusing v-for with v-if for conditional rendering
  • Thinking v-for binds data instead of looping
  • Mixing v-for with event listeners like v-on
2. Which of the following is the correct syntax to render a list of items using v-for in Vue?
easy
A. <li v-for="item of items">{{ item }}</li>
B. <li v-for="items in item">{{ item }}</li>
C. <li v-for="item in items">{{ item }}</li>
D. <li v-for="items of item">{{ items }}</li>

Solution

  1. Step 1: Identify correct v-for syntax

    The correct syntax is v-for="item in items" where items is the array and item is the loop variable.
  2. Step 2: Check each option

    <li v-for="item in items">{{ item }}</li> uses correct syntax and variable names. Options B, C, and D have incorrect order or variable names.
  3. Final Answer:

    <li v-for="item in items">{{ item }}</li> -> Option C
  4. Quick Check:

    Use v-for="item in items" [OK]
Hint: Use 'item in items' to loop correctly [OK]
Common Mistakes:
  • Swapping 'item' and 'items' in the syntax
  • Using 'of' instead of 'in' (Vue uses 'in')
  • Using plural for loop variable instead of singular
3. Given the Vue template:
<ul>
  <li v-for="(fruit, index) in fruits" :key="index">{{ index }} - {{ fruit }}</li>
</ul>

and the data:
fruits: ['Apple', 'Banana', 'Cherry']

What will be the rendered output?
medium
A.
  • index - fruit
  • index - fruit
  • index - fruit
B.
  • Apple - 0
  • Banana - 1
  • Cherry - 2
C.
  • Apple
  • Banana
  • Cherry
D.
  • 0 - Apple
  • 1 - Banana
  • 2 - Cherry

Solution

  1. Step 1: Understand the loop variables

    The v-for uses (fruit, index) in fruits, so index is the position and fruit is the item.
  2. Step 2: Substitute values in template

    Each
  3. shows "index - fruit". For the array ['Apple', 'Banana', 'Cherry'], indexes are 0,1,2 respectively.
  4. Final Answer:

    <ul><li>0 - Apple</li><li>1 - Banana</li><li>2 - Cherry</li></ul> -> Option D
  5. Quick Check:

    Index and fruit displayed correctly [OK]
Hint: Remember: (item, index) in list shows index first [OK]
Common Mistakes:
  • Mixing order of index and item in output
  • Forgetting to use :key with index
  • Assuming 'of' works instead of 'in'
4. What is wrong with this Vue template snippet?
<ul>
  <li v-for="item in items">{{ item }}</li>
</ul>

Given the data:
items: null

What will happen when Vue tries to render this?
medium
A. It will render nothing without error.
B. It will throw a runtime error because items is null.
C. It will render one empty list item.
D. It will render the string 'null' inside a list item.

Solution

  1. Step 1: Understand v-for expects iterable data

    The v-for directive requires an array or object to loop over. If items is null, it is not iterable.
  2. Step 2: Predict Vue behavior on null

    Vue will throw a runtime error because it cannot iterate over null.
  3. Final Answer:

    It will throw a runtime error because items is null. -> Option B
  4. Quick Check:

    v-for needs iterable data [OK]
Hint: v-for needs arrays or objects, not null [OK]
Common Mistakes:
  • Assuming null renders empty list silently
  • Expecting v-for to handle null gracefully
  • Confusing null with empty array []
5. You have a nested array of user objects grouped by city:
const usersByCity = {
  'New York': [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }],
  'Paris': [{ id: 3, name: 'Claire' }]
}

How do you use v-for to render a list showing city names and their users' names inside each city?
hard
A. <div v-for="(users, city) in usersByCity" :key="city"> <h3>{{ city }}</h3> <ul> <li v-for="user in users" :key="user.id">{{ user.name }}</li> </ul> </div>
B. <div v-for="city in usersByCity" :key="city"> <h3>{{ city }}</h3> <ul> <li v-for="user in city" :key="user.id">{{ user.name }}</li> </ul> </div>
C. <div v-for="(city, users) in usersByCity" :key="city"> <h3>{{ city }}</h3> <ul> <li v-for="user in users" :key="user.id">{{ user.name }}</li> </ul> </div>
D. <div v-for="user in usersByCity" :key="user.id"> <h3>{{ user.city }}</h3> <ul> <li>{{ user.name }}</li> </ul> </div>

Solution

  1. Step 1: Understand the data structure

    usersByCity is an object where keys are city names and values are arrays of user objects.
  2. Step 2: Use v-for to loop over object entries

    Use v-for="(users, city) in usersByCity" to get city name and users array. Then loop over users array inside.
  3. Step 3: Check options for correct variable order and keys

    <div v-for="(users, city) in usersByCity" :key="city"> <h3>{{ city }}</h3> <ul> <li v-for="user in users" :key="user.id">{{ user.name }}</li> </ul> </div> correctly uses (users, city) and nested v-for with keys. <div v-for="(city, users) in usersByCity" :key="city"> <h3>{{ city }}</h3> <ul> <li v-for="user in users" :key="user.id">{{ user.name }}</li> </ul> </div> swaps city and users order incorrectly. Options B and D misuse variables.
  4. Final Answer:

    Option A code snippet correctly renders cities and their users. -> Option A
  5. Quick Check:

    Object loop: (value, key) = (users, city) [OK]
Hint: For objects, v-for uses (value, key) in object [OK]
Common Mistakes:
  • Swapping key and value order in v-for
  • Using array syntax for object iteration
  • Missing unique :key on nested loops
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