LoginSignup
0

VuetifyのComboboxでフォーカスが当たったときに部分一致でフィルタする裏技

Posted at

前提

  • Vue2
  • Vuetify2
  • JavaScript

やりたいこと

こんな感じのcomboboxがあったとします

<template>
  <v-combobox v-model="select" :items="items" />
</template>

<script>
export default {
  data: () => ({
    select: "",
    items: ["test1", "test2", "foo", "bar"],
  }),
};
</script>

test と入力すると部分一致でフィルタがかかり、 test1test2 が表示されます。
75dd6fbf891c4a9c13cbc1ed23e9cbc1.gif

しかし、 test と入力されている状態でフォーカスが外れた後に再びフォーカスが当たると、フィルタがかかっていない状態になります。
981955756d98236e86923f31590f82fd.gif

「フォーカスが当たったときにも部分一致でフィルタしてほしい!」と思ったのに公式にはそのオプションがありません。
ということで、裏技的な感じになりますが、自作してみました。

方法

<template>
  <v-combobox
    v-model="select"
    :items="items"
    :search-input.sync="searchInput"
    @focus="forceFilter"
  />
</template>

<script>
export default {
  data: () => ({
    select: "",
    items: ["test1", "test2", "foo", "bar"],
    searchInput: "",
  }),

  methods: {
    forceFilter() {
      this.select += " ";
      setTimeout(() => {
        this.searchInput = this.searchInput.replace(/\s+/g, "");
      }, 10);
    },
  },
};
</script>

comboboxにフォーカスしたときに入力値の末尾にスペースを挿入し、10ms後に末尾のスペースを削除しています。
これによって、フォーカスした際にフィルタがかかります。

setTimeout して遅延実行しているのは、遅延を挟まないとうまくスペース削除が動作しないからです。ここは適宜調整してください。

これで無事、フォーカスが当たったときにフィルタがかかるようになりました。
b2f97ce86df0b79d3919de6a8f2c95d6.gif

参考

コンボボックス・コンポーネント — Vuetify

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0