Bird
Raised Fist0
Vueframework~20 mins

Dynamic render patterns in Vue - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Dynamic Render Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What will this Vue 3 component render?

Consider this Vue 3 component using v-if and v-for together:

<template>
  <ul>
    <li v-for="item in items" :key="item.id" v-if="item.visible">{{ item.name }}</li>
  </ul>
</template>

<script setup>
import { ref } from 'vue'
const items = ref([
  { id: 1, name: 'Apple', visible: true },
  { id: 2, name: 'Banana', visible: false },
  { id: 3, name: 'Cherry', visible: true }
])
</script>

What will be the rendered output inside the <ul>?

Vue
<template>
  <ul>
    <li v-for="item in items" :key="item.id" v-if="item.visible">{{ item.name }}</li>
  </ul>
</template>

<script setup>
import { ref } from 'vue'
const items = ref([
  { id: 1, name: 'Apple', visible: true },
  { id: 2, name: 'Banana', visible: false },
  { id: 3, name: 'Cherry', visible: true }
])
</script>
A<ul><li>Apple</li><li>Cherry</li></ul>
B<ul></ul>
C<ul><li>Apple</li></ul>
D<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>
Attempts:
2 left
💡 Hint

Remember that v-if inside v-for filters items after looping.

❓ state_output
intermediate
2:00remaining
What is the output after clicking the button twice?

This Vue 3 component toggles a message on button click:

<template>
  <button @click="toggle">Toggle</button>
  <p>{{ message }}</p>
</template>

<script setup>
import { ref } from 'vue'
const show = ref(false)
const message = ref('Hidden')
function toggle() {
  show.value = !show.value
  message.value = show.value ? 'Visible' : 'Hidden'
}
</script>

What will the <p> show after clicking the button twice?

Vue
<template>
  <button @click="toggle">Toggle</button>
  <p>{{ message }}</p>
</template>

<script setup>
import { ref } from 'vue'
const show = ref(false)
const message = ref('Hidden')
function toggle() {
  show.value = !show.value
  message.value = show.value ? 'Visible' : 'Hidden'
}
</script>
AError: message is not defined
BVisibleVisible
CHidden
DVisible
Attempts:
2 left
💡 Hint

Each click toggles the state. Think about the state after two toggles.

📝 Syntax
advanced
2:00remaining
Which option correctly uses dynamic component rendering in Vue 3?

You want to render a component dynamically based on a variable currentView. Which option uses the correct syntax?

Vue
<template>
  <component :is="currentView" />
</template>

<script setup>
import { ref } from 'vue'
const currentView = ref('MyComponent')
</script>
A<component :is="'currentView'" />
B<component :is="currentView" />
C<component is="currentView" />
D<component :is="currentView()" />
Attempts:
2 left
💡 Hint

Dynamic component requires binding the is attribute to a variable.

🔧 Debug
advanced
2:00remaining
Why does this Vue 3 dynamic list not update on state change?

Given this component:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
  <button @click="addItem">Add Item</button>
</template>

<script setup>
import { reactive } from 'vue'
const items = reactive([
  { id: 1, name: 'One' },
  { id: 2, name: 'Two' }
])
function addItem() {
  items.push({ id: 3, name: 'Three' })
}
</script>

Clicking 'Add Item' does not update the list. What is the cause?

Vue
<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
  <button @click="addItem">Add Item</button>
</template>

<script setup>
import { reactive } from 'vue'
const items = reactive([
  { id: 1, name: 'One' },
  { id: 2, name: 'Two' }
])
function addItem() {
  items.push({ id: 3, name: 'Three' })
}
</script>
AUsing reactive on an array does not track push mutations properly; use ref([]) instead.
BThe addItem function is not bound to the component instance.
CThe key attribute is missing, so Vue cannot track list items.
DThe items array is not initialized correctly; it should be a plain array.
Attempts:
2 left
💡 Hint

Think about how Vue tracks changes in arrays with reactive vs ref.

🧠 Conceptual
expert
2:00remaining
What is the main benefit of using <Suspense> in Vue 3 dynamic rendering?

Vue 3 introduces the <Suspense> component. What is its primary purpose when rendering dynamic components?

AIt disables reactivity temporarily to improve performance.
BIt automatically caches all dynamic components for faster rendering.
CIt forces all child components to render synchronously to avoid flicker.
DIt allows showing fallback content while async components or data are loading.
Attempts:
2 left
💡 Hint

Think about user experience when waiting for slow components.

Practice

(1/5)
1. What does the :is directive do in Vue's dynamic render patterns?
easy
A. It dynamically switches which component or element to render.
B. It binds a CSS class to an element.
C. It listens for user input events.
D. It creates a loop to render multiple items.

Solution

  1. Step 1: Understand the purpose of :is

    The :is directive in Vue allows you to dynamically choose which component or HTML element to render based on a variable.
  2. Step 2: Compare with other directives

    Unlike class binding or event listening, :is changes the actual rendered tag or component, making the UI flexible.
  3. Final Answer:

    It dynamically switches which component or element to render. -> Option A
  4. Quick Check:

    :is = dynamic component switch [OK]
Hint: Remember :is changes the tag or component shown [OK]
Common Mistakes:
  • Confusing :is with event handlers
  • Thinking :is binds CSS classes
  • Assuming :is creates loops
2. Which of the following is the correct syntax to conditionally render a component in Vue using v-if?
easy
A. <MyComponent :is='show' />
B. <MyComponent v-if='show' />
C. <MyComponent v-for='show' />
D. <MyComponent v-show='show' />

Solution

  1. Step 1: Identify the directive for conditional rendering

    v-if is used to conditionally render elements or components based on a boolean expression.
  2. Step 2: Check the syntax correctness

    The syntax <MyComponent v-if='show' /> correctly applies v-if to render MyComponent only if show is true.
  3. Final Answer:

    <MyComponent v-if='show' /> -> Option B
  4. Quick Check:

    v-if = conditional render [OK]
Hint: Use v-if to show/hide components conditionally [OK]
Common Mistakes:
  • Confusing v-if with v-show
  • Using v-for for conditional rendering
  • Misusing :is for boolean conditions
3. Given the Vue template:
<component :is="currentView" />

and the data:
data() { return { currentView: 'HomeView' } }

What will be rendered if HomeView is a registered component?
medium
A. An error will occur because component tag is invalid.
B. Nothing will render because currentView is a string.
C. The literal text 'HomeView' will be shown.
D. The HomeView component will be rendered.

Solution

  1. Step 1: Understand <component :is=... /> usage

    The <component> tag with :is dynamically renders the component named by the string in currentView.
  2. Step 2: Check if HomeView is registered

    Since HomeView is registered, Vue will render that component in place of <component>.
  3. Final Answer:

    The HomeView component will be rendered. -> Option D
  4. Quick Check:

    Dynamic component name string renders component [OK]
Hint: Dynamic :is renders component named by string [OK]
Common Mistakes:
  • Thinking string names don't render components
  • Confusing component tag as invalid HTML
  • Expecting literal text instead of component
4. What is wrong with this Vue template snippet?
<component :is="viewName" v-if="viewName" />

where viewName can be null or a component name string.
medium
A. It will throw an error if viewName is null.
B. The :is binding must be a component object, not a string.
C. There is no problem; it works correctly.
D. The v-if should be replaced with v-show.

Solution

  1. Step 1: Analyze v-if="viewName" behavior

    The v-if prevents rendering when viewName is null or falsy, so the component won't render or cause errors.
  2. Step 2: Check :is binding type

    :is accepts a string naming a registered component or a component object, so a string is valid.
  3. Final Answer:

    There is no problem; it works correctly. -> Option C
  4. Quick Check:

    v-if blocks null, :is accepts string [OK]
Hint: v-if prevents null rendering errors [OK]
Common Mistakes:
  • Assuming null causes errors without v-if
  • Confusing v-show with v-if
  • Thinking :is only accepts objects
5. You want to render a list of components dynamically based on an array of component names, but only if the component name is not empty. Which Vue pattern correctly achieves this?
hard
A.
<template>
  <component
    v-for="name in componentNames"
    :key="name"
    :is="name"
    v-if="name"
  />
</template>
B.
<template>
  <component
    v-for="name in componentNames"
    :key="name"
    :is="name"
  />
</template>
C.
<template>
  <component
    v-if="componentNames.length"
    :is="componentNames"
  />
</template>
D.
<template>
  <component
    v-for="(name, index) in componentNames"
    :key="index"
    :is="name"
    v-show="name"
  />
</template>

Solution

  1. Step 1: Use v-for to loop over component names

    Looping over componentNames with v-for renders multiple components dynamically.
  2. Step 2: Filter out empty names with v-if="name"

    Adding v-if="name" ensures only non-empty strings render components, avoiding errors or empty renders.
  3. Step 3: Use :key with unique name for list rendering

    Using :key="name" helps Vue track each component efficiently.
  4. Final Answer:

    Option A correctly loops, filters, and renders components dynamically. -> Option A
  5. Quick Check:

    Loop + v-if filter + :is = correct pattern [OK]
Hint: Use v-for with v-if to filter dynamic components [OK]
Common Mistakes:
  • Not filtering empty names causing errors
  • Using v-if on parent instead of each item
  • Missing :key in 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