当v-if与v-for一起使用时,改为通过计算属性先过滤列表


当v-if与v-for一起使用时,v-for具有比v-if更高的优先级。这意味着v-if将分别作用于每个v-for循环迭代中的元素。然而,Vue官方推荐尽量避免同时使用v-if和v-for。如果需要这样做,考虑通过计算属性先过滤列表。

假设你有一个任务列表,但只想显示未完成的任务:

<ul>
  <li v-for="task in tasks" v-if="!task.isCompleted">{{ task.description }}</li>
</ul>

在上面的代码中,每个任务都会被v-for遍历,但只有当task.isCompleted为false时(即任务未完成时),对应的任务描述才会被渲染。

更好的做法是使用计算属性:

computed: {
  unfinishedTasks() {
    return this.tasks.filter(task => !task.isCompleted);
  }
}

 
然后在模板中使用这个计算属性:

<ul>
  <li v-for="task in unfinishedTasks">{{ task.description }}</li>
</ul>


这种方法更清晰,并且性能更好,因为它避免了在每次渲染中对列表的重复评估和过滤,而是只在任务列表发生变化时才重新计算过滤后的列表。

方案一:
computed: {
    //先对books的数据进行过滤计算
    filterBooks(){
        let newBooks = []
        for (i = 0; i < this.books.length; i++) {
            if (this.books[i].price > 500) {
                newBooks.push(this.books[i])
            }
        }
        console.log(newBooks)
        return newBooks
    }
}
方案二:vue3推荐使用filter
computed: {
    //先对books的数据进行过滤计算
    filterBooks2(){
        return this.books.filter(function (item) {
            // 便利所有的books,赋值给数组
            console.log("item", item)
            return item.price > 500
        })
    }
}

在给出的代码段中,filterBooks2 方法通过 filter 函数过滤 books 数组,返回所有 price 大于 500 的书籍。filter 函数是 JavaScript 中的数组方法之一,它创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。条件检查是在回调函数中完成的,每个数组元素都会执行一次回调函数。

  1. filter 方法的回调函数:this.books.filter(function (item){…}) 中的 function(item) 是 filter 方法的回调函数,item 表示数组中的当前遍历到的元素。在这个场景下,item 代表 books 数组中的一个书籍对象。
  2. 判断条件 item.price>500:这是 filter 方法的核心判断逻辑,用来检查当前书籍对象的 price 属性是否大于 500。
  3. 返回值:filter 方法会创建一个新数组,包含所有通过测试(即函数返回 true)的元素。在本例中,所有价格大于500的书籍对象会被包含在返回的新数组中。

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_45782719/article/details/135950612

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注