Files
tiptap/docs/src/demos/Nodes/Mention/MentionList.vue
2021-01-18 16:45:49 +01:00

88 lines
1.3 KiB
Vue

<template>
<div class="items">
<div
class="item"
:class="{ 'is-selected': index === selectedIndex }"
v-for="(item, index) in items"
:key="index"
>
{{ item }}
</div>
</div>
</template>
<script>
export default {
props: {
items: {
type: Array,
default: () => [],
},
},
data() {
return {
selectedIndex: 0,
}
},
watch: {
items() {
this.selectedIndex = 0
},
},
methods: {
onKeyDown({ event }) {
if (event.key === 'ArrowUp') {
this.upHandler()
return true
}
if (event.key === 'ArrowDown') {
this.downHandler()
return true
}
if (event.key === 'Enter') {
this.enterHandler()
return true
}
return false
},
upHandler() {
this.selectedIndex = ((this.selectedIndex + this.items.length) - 1) % this.items.length
},
downHandler() {
this.selectedIndex = (this.selectedIndex + 1) % this.items.length
},
enterHandler() {
const item = this.items[this.selectedIndex]
if (item) {
console.log('select', item)
}
},
},
}
</script>
<style lang="scss" scoped>
.items {
position: relative;
}
.item {
background: white;
color: black;
padding: 0.5rem;
&.is-selected {
background: #ccc;
}
}
</style>