Skip to main content

INFO 4340/5440: Interactive Components

Class 4: Interactive Components​

  1. Review: Vue.js Events & Reactive Variables
  2. Components
  3. Props
  4. Conditional Rendering
  5. Rendering Lists

Review: Event Handling – Vue.js​

The v-on directive listens for DOM events and runs JavaScript code when they're triggered.

v-on Directive​

<script setup>
function buttonClicked() {
console.log('Button clicked!')
}
</script>

<template>
<button v-on:click="buttonClicked">Click Me!</button>
</template>

@ Shorthand​

<script setup>
function buttonClicked() {
console.log('Button clicked!')
}
</script>

<template>
<button @click="buttonClicked">Click Me!</button>
</template>

Review: Reactive Variable + Interpolation​

<script setup>
import { ref } from 'vue'
const count = ref(0)

function incrementCount() {
count.value++
}
</script>

<template>
<button @click="incrementCount">
Increment
</button>
<span>{{ count }}</span>
</template>

Review: .vue Files​

  • Each .vue file is a component.
  • Each component has:
    • <script>: JavaScript logic
    • <template>: HTML structure
    • <style>: CSS styling
<script setup>
</script>

<template>
<button>Click Me!</button>
</template>

<style scoped>
button {
font-size: 1.5em;
padding: 0.5em 1em;
}
</style>

Components​


User Interface Components​

Definition: A component is a reusable, self-contained piece of user interface (UI) that can be used to build larger applications.

Examples:

  • Button
  • Slider
  • Search Input
  • Dropdown Menu

Review: React Components​

components/StarRating.jsx:

export default function StarRating() {
return (
<div>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
</div>
)
}

App.jsx:

import StarRating from './components/StarRating.jsx'

export default function App() {
return (
<>
<StarRating />
</>
)
}

Vue.js Components​

components/StarRating.vue:

<script setup>
</script>

<template>
<div>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
</div>
</template>

<style scoped>
</style>

App.vue:

<script setup>
import StarRating from './components/StarRating.vue'
</script>

<template>
<StarRating />
</template>

Activity: Component Practice​

  1. Open the activity repository for today's class.
  2. Create a new SoundButton component with hard-coded data. Hardcode the sound name, icon, and sound file into the component. For example: "Rain", rain.svg, and rain.mp3.
  3. The SoundButton component should include internally include the ability to play the sound when clicked.
  4. Use the SoundButton component in your app to replace the existing button for that sound.

Props​


Review: React Props​

components/StarRating.jsx:

export default function StarRating({name}) {
return (
<div>
<span>{name}</span>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
</div>
)
}

App.jsx:

import StarRating from './components/StarRating.jsx'

export default function App() {
return (
<>
<StarRating name="Movie Rating"/>
</>
)
}

Vue.js Props​

components/StarRating.vue:

<script setup>
defineProps({
name: String
})
</script>

<template>
<div>
<span>{{ name }}</span>
<button>'☆'</button>
<button>'☆'</button>
...

App.vue:

<script setup>
import StarRating from './components/StarRating.vue'
</script>

<template>
<StarRating name="Movie Rating"/>
</template>

Activity: Props Practice​

  1. Modify the SoundButton component to accept props for the sound name, icon, and sound file.
  2. Use the SoundButton component in your app to replace the existing button for that sound, passing the appropriate props to the component.
<script setup>
defineProps({
name: String
})
</script>

Gotcha: Binding Props​

Literal values:

<StarRating name="Movie Rating"/>

Variables, Reactive Variables, Expressions:

<script setup>
import { ref } from 'vue'
const movieRating = ref('Movie Rating')
</script>

<template>
<StarRating :name="movieRating"/>
</template>
<script setup>
import { ref } from 'vue'
const movieRating = ref('Movie Rating')
</script>

<template>
<StarRating v-bind:name="movieRating"/>
</template>

Comparison: React vs Vue.js​

React​

export default function App() {
const movieRating = "Movie Rating"

return (
<>
{/* string literal */}
<StarRating name="Movie Rating"/>

{/* variable */}
<StarRating name={movieRating}/>
</>
)
}

Vue.js​

<script setup>
import { ref } from 'vue'
const movieRating = ref('Movie Rating')
</script>

<template>
<!-- string literal -->
<StarRating name="Movie Rating"/>

<!-- variable -->
<StarRating :name="movieRating"/>
</template>

Conditional Rendering​


Review: React Conditional Rendering​

components/StarRating.jsx:

export default function StarRating({name}) {
return (
<div>
{!!name && <span>{name}</span>}
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
<button>'☆'</button>
</div>
)
}

Vue.js Conditional Rendering​

components/StarRating.vue:

<script setup>
defineProps({
name: String
})
</script>

<template>
<div>
<span v-if="!!name">{{ name }}</span>
<button>'☆'</button>
...

Activity: Conditional Rendering Practice​

Working with your peer, complete the handout.

<script setup>
defineProps({
name: String
})
</script>

<template>
<div>
<span v-if="!!name">{{ name }}</span>
<button>'☆'</button>
...

Rendering Lists​


Review: React Lists​

components/StarRating.jsx:

export default function StarRating({name}) {
return (
<div>
<span>{name}</span>
{[1, 2, 3, 4, 5].map((num) => (
<button key={num}>'☆'</button>
))}
</div>
)
}

Vue.js v-for Directive​

components/StarRating.vue:

<script setup>
defineProps({
name: String
})
</script>

<template>
<div>
<span>{{ name }}</span>
<button v-for="num in 5" :key="num">'☆'</button>
</div>
</template>

Activity: Rendering Lists Practice​

Render a list of SoundButton components in your app using the v-for directive. (They should all be the same sound button for this activity.)

<template>
<button v-for="num in 5" :key="num">'☆'</button>
</template>

What's Next​

Render different SoundButton components in your app using the v-for and reactive variables.

  • Due Monday, 9/7/2026, 11:59PM: Class 5, Preparation