【问题标题】:Add keyboard shortcuts to navigate next & prev pages添加键盘快捷键以导航下一页和上一页
【发布时间】:2019-09-08 05:25:59
【问题描述】:

我有三个页面 home, about & details 并且我在每个页面的 Vue mounted 生命周期钩子上添加了一个 keydown 事件监听器,所以每当用户点击 ctrl + rightArrow 我触发 nextPage() 方法,它将推送vue 路由器的下一页,同样ctrl + leftArrow 应该触发prevPage()。我在nextPage() & prevPage() 中使用不同的路由在每个页面上实现相同的功能。这里的问题是,即使我没有在某些页面上添加keydown 侦听器,事件也会触发并从先前加载的事件侦听器导航到路由,并且之前的侦听器也多次触发。

export default {
  mounted() {
    window.addEventListener('keydown', this.handleKeyPress);
  },
  methods: {
    handleKeyPress(e) {
      if (e.ctrlKey && e.keyCode === 37) { // Previous page
        this.prevPage();
      } else if (e.ctrlKey && e.keyCode === 39) { // Next page
        this.nextPage();
      }
    },
    nextPage() {
      this.$router.push({ name: 'about' });
    },
    prevPage() {
      this.$router.push({ name: 'home' });
    }
  }
}

【问题讨论】:

    标签: vue.js vue-component keyboard-shortcuts vue-router keydown


    【解决方案1】:

    您可以将事件处理程序附加到document

    created() {
        if (typeof window !== 'undefined') {
            document.addEventListener('keydown', this.handleKeyPress)
        }
    },
    beforeDestroy() {
        if (typeof window !== 'undefined') {
            document.removeEventListener('keydown', this.handleKeyPress)
        }
    }
    

    【讨论】:

      【解决方案2】:

      您将keydown 事件绑定到窗口,并且由于您有一个单页应用程序,因此即使您转到另一条路线,侦听器仍将侦听窗口上的事件(因为新路线在同一个窗口)。您可以尝试使用 Vue 的内置 event handling 功能将 keydown 事件绑定到每个组件的根元素,就像这样。这样,当您转到新路由时,新的侦听器会侦听新组件。

      这就是将事件绑定到div 根元素的方法:

      <template>
        <div v-on:keydown="handleKeyPress">
          <rest of your component's template>
        </div>
      </template> 
      

      您可能还需要将tabindex="0" 属性添加到div 根元素,以便它能够listen 处理键盘事件。

      【讨论】:

      • 它有效,但我需要听整个window,而不是特定的div
      • 然后在 Vue 路由器的navigation guards 窗口上添加和删除事件监听器。
      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      相关资源
      最近更新 更多