- Add the
v-on directive (shorthand is@ ) to the element (for example;@keyup ,@keydown ). - Set focus on the element (add the property
tabindex="0" ). - To set focus programmatically with
.focus() , if the action or event that initiated the change in focus causes the DOM to change (it usually does) you must set focus using$nextTick to wait for the DOM to update first.
<div class="notify-item-list" v-for="(entry, index) in category.entries" :key="entry.id">
<a href="#" @click="selectItem(category.entries, index)" class="text-black" :class="{ 'text-bold': isUnread(entry) }">{{ entry.title }}</a>
<div id="notification-modal" tabindex="0" ref="notifyModal" @keyup="navKeys" class="item-detail modal" :class="{ 'is-active': showItemDetail(entry) }">
methods: {
selectItem: function ( entries, index ) {
this.selectedItemIndex = index;
this.$nextTick( () => {
let input = this.$refs.notifyModal[index];
input.focus();
}),
navKeys: function ( e ) {
switch( e.keyCode ) {
case 27: // esc
this.hideItemDetail();
break;
case 37: // left
this.prevNotificationDetail(this.category.entries);
break;
case 39: // right
this.nextNotificationDetail(this.category.entries);
break;
}
}
}
It’s a little more involved when multiple similar elements are created with the
https://laracasts.com/discuss/channels/vue/vue-set-focus-to-input-created-by-v-for?page=1
See the 4th, 5th, and 6th replies by Kazuya.Gosho, MacPrawn and lukas.pierce. The last one was the most helpful. Anyway, it works like a charm. Feels a little kludgy, but considering how the user is interacting with the DOM it makes sense.
No comments:
Post a Comment