自定义vue组件的模糊事件

时间:2020-08-17 09:05:39

标签: javascript typescript vue.js vue-component

我有什么
自定义的DropDown,上面输入了过滤器文本。可以独立于过滤器文本输入打开DropDown。

我想要的
预期的行为是,当过滤器输入失去焦点时,以及当我在DropDown之外用鼠标单击时,下拉菜单都会关闭,从而使DropDown失去焦点。

我尝试过的事情

  • 绑定到控件中我的根div元素上的blur事件,它根本不会触发。
  • 我也找不到关于我可以覆盖的内部组件方法的任何信息。

代码

  <div @blur="onRootLostFocus">
    ...
  </div>

  ...
  ...
  ...

  onRootLostFocus() {
    console.log('LostFocus');
    this.deactivateSearchPanel();
    this.deactivateSelectionPanel();
  }

解决方案

我错过了,一个div需要tabindex="0"才能集中注意力,这解决了我的问题

1 个答案:

答案 0 :(得分:3)

像这样吗?

答案:您需要设置tabindex="0"使其聚焦。

在此自定义下拉菜单中如何操作:

Vue.component("dropdown", {
   props: ["value"],
   data(){
      return {
         open: false,
         options: ["BMW", "Fiat", "Citroen", "Audi", "Tesla"]
      }
   },
   methods: {
      toggleDropdown() {
         this.open = !this.open;
      },
      closeDropdown(){
         this.open = false;
      },
      selectOption(option) {
         this.$emit("input", option);
      }
   },
   template: `<div class="dropdown">
   <div @blur="closeDropdown" tabindex="0" ref="dropdown" @click="toggleDropdown" class="select">
   {{ value }}
   </div>
   <div class="options" :style="{'max-height': open ? '300px' : '0px'}">
      <div v-for="option in options" @mousedown="selectOption(option)" class="option">
         {{ option }}
      </div>
   </div>
</div>`
})

new Vue({
   el: "#app",
   data: {
      selectedCar: "BMW"
   }
})
.dropdown {
   width: 200px;
   position: relative;
}

.select {
   height: 40px;
   position: absolute;
   left: 0;
   width: 100%;
   background: green;
   display: flex;
   justify-content: center;
   align-items: center;
   color: white;
   cursor: pointer;
}
.option {
   width: 100%;
   height: 40px;
   background: darkgreen;
   color: white;
   display: flex;
   justify-content: center;
   align-items: center;
   cursor: pointer;
}
.option:hover {
   background: green;
}
.options {
   overflow: hidden;
   transition: max-height 200ms;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app"> <p>
   {{ selectedCar }}</p>
   <dropdown v-model="selectedCar" />
  
</div>