LoginSignup
0
0

More than 1 year has passed since last update.

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

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0