Как вводить и фильтровать в выпадающем списке select в vue

#vue.js

#vue.js

Вопрос:

У меня есть выпадающий список, в котором есть список категорий. Я хотел бы иметь возможность вводить в раскрывающемся списке и фильтровать мой выпадающий список тем, что я ввел, чтобы пользователю было проще найти категорию, которая им нужна. Я изо всех сил пытаюсь заставить это работать, и я не уверен, как это сделать.

Вот мой код

 <template>
    <transition name="modal-fade">
        <div>
            <div class="modal-backdrop show"></div>
            <div class="modal" style="display: inline;">
                <div class="modal-dialog modal-dialog-scrollable" role="document" style="width: 680px; max-width: 680px;">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h5 class="modal-title">{{product.name}}</h5>
                            <button type="button" class="close" @click="close">
                                <span aria-hidden="true">amp;times;</span>
                            </button>
                        </div>
                        <div class="modal-body">
                            <table class="table table-striped table-sm">
                                <thead>
                                    <tr>
                                        <th>Name</th>
                                        <th>Remove</th>
                                    </tr>
                                </thead>
                                <tbody>
                                <tr v-for="cat in addedCat">
                                    <td>[{{ cat.id }}] {{ cat.name }}</td>
                                    <td><button @click="removeCat(cat)" class="btn btn-sm btn-danger">Remove</button></td>
                                </tr>
                                <tr>
                                    <select class="form-control">
                                        <option value=""><input type="text"></option>
                                        <option v-for="option in options" :value="option.id">{{ option.text }}</option>
                                    </select>
                                </tbody>
                            </table>


                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-secondary" @click="close">Close</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </transition>
</template>

<script>
    export default {
        props: ['user', 'products', 'bus'],
        data() {
            return {
                addedCat: [],
                options: []
            }
        },
        mounted() {
            axios.get('/admin/product/' this.product.id '/categories').then((response) => {
                this.addedCat = response.data.categories;
            });

            this.getCategories();
        },
        computed: {

        },
        methods: {
            getCategories(){
                let filCat = this.categories.filter(c => {
                    return this.addedCat.find(ac => ac.id === c.id) == null;
                })

                this.options.push({id: 0, text: "Please select one"});

                filCat.forEach(c => {
                    this.options.push({
                        id: c.id,
                        text: c.name
                    });
                });
            },
        }
    }
</script>
  

Ответ №1:

Если я правильно понял, вы хотите отфильтровать options список. Привяжите v-model к вашим поисковым данным.

 <input ... v-model='searchFor' />
  

и смотрите это

 methods: {
  search() {
    this.options.filter(category => category.toLowerCase().match('this.searchFor.toLowerCase()'))
  }
}

watch: {
  searchFor() {
     this.search()
  }
}
  

Это будет фильтровать, когда пользователь вводит что-то, но когда пользователь удаляет что-то, что нужно для поиска, вы должны улучшить. Нравится:

 data() {
  return {
    ...
    optionsCopy: [], // Always have first unchanged array
    searchForCopy: '',
  }
}
  

Когда пользователь удаляет что-то в searchFor, вы должны отслеживать это.

 watch: {
  searchFor() {
     if (this.searchFor.length > this.searchForCopy) {
        this.search()
     } else {
        this.options = this.optionsCopy
        this.search()
     }
     this.searchForCopy = this.searchFor
  }
}
  

Если я правильно понимаю вашу проблему. Вы должны решить свою проблему примерно так, как описано выше, с помощью кода.

Комментарии:

1. но мне также нужно, чтобы выпадающий список select также был открыт. Итак, когда я нажимаю на свой выбор, я получаю выпадающий список со всеми моими категориями, а затем, если мне нужно, я также могу ввести название своей категории, и мои параметры выбора будут отфильтрованы до него.