我在使用vue-select组件时遇到了一些自定义模糊和焦点行为的小问题。
我试图覆盖组件的模糊行为,如果用户点击离开并点击特定的预定义目标 - 例如,如果用户在#special-place
选择打开时点击,则选择应该保持打开状态,直到任何其他元素收到重点。
下面的代码让我了解了大部分情况,但有一个小错误:如果打开了一个下拉菜单并单击了另一个选择组件,则第二个组件保持打开状态,无论后续单击如何。这是一个沙盒,有一个活生生的例子。
模板如下:
<template>
<v-select
@search:blur="customBlurHandler"
:options="options"
:filterable="false"
:ref="reference"
:placeholder="placeholder"
label="name"
>
<!-- Remove caret icon -->
<div slot="open-indicator"></div>
</v-select>
</template>
相关方法如下(不是最好的命名,我知道):
export default {
data() {
return {
options: ["one", "two", "three"],
isBlurHandlerActive: false,
reference: `${this.locationType}Select`
};
},
props: ["locationType", "placeholder"],
name: "CustomSelector",
components: { vSelect },
methods: {
clickHandler(event) {
const specialClicked = event.target.closest("#special-place") !== null;
if (specialClicked) return;
else {
this.isBlurHandlerActive = true;
document.removeEventListener("click", this.clickHandler);
this.forceOptionsClosed();
}
},
customBlurHandler() {
if (this.isBlurHandlerActive) {
this.isBlurHandlerActive = false;
return;
} else {
this.forceOptionsOpen();
document.addEventListener("click", this.clickHandler);
}
},
forceOptionsClosed() {
this.$refs[this.reference].open = false;
this.$refs[this.reference].searchEl.blur();
},
forceOptionsOpen() {
this.$refs[this.reference].open = true;
this.$refs[this.reference].searchEl.focus();
}
}
};
我也知道这可能不是解决问题的最类似于 vue 的方法,所以如果有更好的方法来解决这个问题,我愿意接受建议。