javascript - VueJS : Filter array of objects when user search for something

标签 javascript vue.js vuejs2

基本上,此代码负责将 sortedCars 数组中包含的汽车名称列表显示到下拉列表中。 (该数组按字符串 asc 排序)。

现在,我添加了一个输入文本,并且我正在尝试自动过滤与输入的名称值匹配的汽车列表。

使用以下代码,UI 永远不会更新。哪里错了?

<template>
        <div class="btn-group pull-left">
            <input type="text" @keyup="onFilterCars" v-model="searchCarTextValue" />
            <a v-for="car in this.sortedCars" :key="car.name" @click="onSelectCategoryFilterLabel" class="dropdown-item" href="#">
                <span v-else>{{ car.name }}</span>
            </a>
        </div>
</template>

<script>
export default {
    data() {
        return {
            inputFilterText: "",
            mapFilteringEnabled: false,
            searchCarTextValue: ""
        };
    },
    props: {
        cars: {
            type: Array
        }
    },
    computed: {

        sortedCars: function() {

            function compare(a, b) {

                if (a.name < b.name)
                    return -1;
                if (a.name > b.name)
                    return 1;

                return 0;
            }

            var sortedArr = this.cars.sort(compare);

            return sortedArr;
        }

    },
    methods: {

        onFilterCars() {
            if (this.searchCarTextValue) {
                var arrayFiltered = this.sortedCars.filter( (car) => {
                    return car.name.toLowerCase().indexOf(this.searchCarTextValue.toLowerCase()) != -1
                });
                this.sortedCars = arrayFiltered;
            }
        }

    }
};
</script>

最佳答案

在vue中很容易过滤,通常我采取这样的方法:

<template>
<div>
    <div" class="btn-group pull-left">
        <input type="text" v-model="filters.searchCarTextValue" />
    </div">
</div>
</template>

<script>
export default {
{
    data(){
        return {
            filters:{
                searchCarTextValue: ''
            }
        }
    },
    props: {
        cars: {
            type: Array
        }
    },
    computed: {
        // returns list of cars based of filters
        filtered_cars(){
            let vm = this;
            if(!vm.filters.searchCarTextValue){
                return [];
            }
            return vm.sortedCars.filter(car => {
                return car.name.toLowerCase().indexOf(vm.filters.searchCarTextValue.toLowerCase()) != -1
            })
        },
        sortedCars: function() {

            function compare(a, b) {

                if (a.name < b.name)
                    return -1;
                if (a.name > b.name)
                    return 1;

                return 0;
            }

            var sortedArr = this.cars.sort(compare);

            return sortedArr;
        }
    }
}
</script>

这样就不需要使用方法来过滤,因为只要 filters.searchCarTextValuesortedCars 发生变化,计算值就会发生变化。因此您也不需要按钮来触发过滤。

工作示例:https://jsfiddle.net/rmfbpLk9/2/

关于javascript - VueJS : Filter array of objects when user search for something,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59409729/

相关文章:

javascript - 无法从js中的 map 获取值(value)

node.js - 捆绑Quasar/Express/Electron App进行生产-Express服务器无法启动

vue.js - 在页面加载时根据vue js中的父高度设置元素高度

javascript - 自定义指令进行组件渲染

Javascript:是否有 CSS 转换开始事件?

javascript - 为什么在全局安装时 grunt 不起作用?

javascript - 如何将 v-for 的值绑定(bind)到 v-if

javascript - 父组件不监听 VUE2 中的自定义事件

javascript - Angular ng-options 选择未设置为初始值

vue.js - 动态显示数组长度