v-if及v-for、computed计算属性的使用

v-if 概念及使用

v-if是Vue.js中的一个指令,用于根据表达式的真假值条件性地渲染一块内容。如果表达式的值返回真,则Vue会渲染这块内容;如果返回假,则不渲染。

基本用法:

<p v-if="isVisible">看到我了吗?</p>

在这个例子中,只有当isVisible的值为true时,<p>标签才会被渲染。

v-for 概念及使用

v-for是Vue.js中的一个指令,用于基于源数据多次渲染元素或模板块。v-for指令需要使用item in items形式的特殊语法,其中items是源数据数组,item是为数组元素提供的别名。

基本用法:

<ul><li v-for="item in items">{{ item.text }}</li>
</ul>

这里,对于items数组中的每个元素,都会渲染一个<li>标签,并显示其text属性的值。

结合使用原理及例子

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

结合使用的例子:

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

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

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

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

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

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

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

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

下面我们通过例子进行详解:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>v-if</title><script src="../vue 初识/vue.js"></script><style>table,tr,th,td{border: 1px solid red;border-collapse: collapse;}th ,td{width: 200px;text-align: center;height: 30px;line-height: 30px;}</style>
</head>
<body>
<div id="app"><!--vue标签判断--><div v-if="this.age > 18"><div>成人</div><ul><li>江西</li><li>湖南</li><li>四川</li></ul></div><div v-else><div>儿童</div><ul><li>动漫</li><li>故事会</li><li>武侠</li></ul></div><table ><tr><th>序号</th><th>书名</th><th>价格</th><th>出版社</th></tr><tr v-for="(book,index) in books"><td>{{index+1}}</td><td>{{book.name}}</td><td>{{book.price}}</td><td>{{book.publish}}</td></tr></table>
</div><!--vue标签控制-->
<script>const app={data(){return{use:"liqiang" ,age:18,books:[{name:"水浒传",price:3999,publish:"人民出版社"},{name:"红楼梦",price:299,publish:"机械出版社"},{name:"西游记",price:399,publish:"西瓜出版社"},{name:"西厢记",price:499,publish:"香蕉出版社"}]}}}vm=Vue.createApp(app).mount('#app')
</script>
</body>
</html>

页面展示效果如下图:
在这里插入图片描述
如果此刻想对价格进行过滤该如何操作?比如只显示价格大于500的书籍?
解决方法一:

    <template v-for="(book,index) in books"><tr v-if="book.price > 500" ><td>{{index+1}}</td><td>{{book.name}}</td><td>{{book.price}}</td><td>{{book.publish}}</td></tr></template>

但是这种方法只是传统解决办法,不是vue3.0官方解决办法。
解决方法二:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>v-if</title><script src="../vue 初识/vue.js"></script><style>table,tr,th,td{border: 1px solid red;border-collapse: collapse;}th ,td{width: 200px;text-align: center;height: 30px;line-height: 30px;}</style>
</head>
<body>
<div id="app"><!--vue标签判断--><div v-if="this.age > 18"><div>成人</div><ul><li>江西</li><li>湖南</li><li>四川</li></ul></div><div v-else><div>儿童</div><ul><li>动漫</li><li>故事会</li><li>武侠</li></ul></div><table ><tr><th>序号</th><th>书名</th><th>价格</th><th>出版社</th></tr><tr v-for="(book,index) in filterBooks"><td>{{index+1}}</td><td>{{book.name}}</td><td>{{book.price}}</td><td>{{book.publish}}</td></tr></table>
</div><!--vue标签控制-->
<script>const app={data(){return{use:"liqiang" ,age:18,books:[{name:"水浒传",price:3999,publish:"人民出版社"},{name:"红楼梦",price:299,publish:"机械出版社"},{name:"西游记",price:899,publish:"西瓜出版社"},{name:"西厢记",price:499,publish:"香蕉出版社"}]}},methods:{},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}}}vm=Vue.createApp(app).mount('#app')
</script>
</body>
</html>

如图:
在这里插入图片描述方法三,官方推荐:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>v-if</title><script src="../vue 初识/vue.js"></script><style>table,tr,th,td{border: 1px solid red;border-collapse: collapse;}th ,td{width: 200px;text-align: center;height: 30px;line-height: 30px;}</style>
</head>
<body>
<div id="app"><!--vue标签判断--><div v-if="this.age > 18"><div>成人</div><ul><li>江西</li><li>湖南</li><li>四川</li></ul></div><div v-else><div>儿童</div><ul><li>动漫</li><li>故事会</li><li>武侠</li></ul></div><table ><tr><th>序号</th><th>书名</th><th>价格</th><th>出版社</th></tr><tr v-for="(book,index) in filterBooks2"><td>{{index+1}}</td><td>{{book.name}}</td><td>{{book.price}}</td><td>{{book.publish}}</td></tr></table>
</div>
<!--vue标签控制-->
<script>const app={data(){return{use:"liqiang" ,age:18,books:[{name:"水浒传",price:3999,publish:"人民出版社"},{name:"红楼梦",price:299,publish:"机械出版社"},{name:"西游记",price:899,publish:"西瓜出版社"},{name:"西厢记",price:499,publish:"香蕉出版社"}]}},methods:{},computed:{//先对books的数据进行过滤计算filterBooks2(){return this.books.filter(function (item){// 便利所有的books,赋值给数组console.log("item",item)return item.price>500})}}}vm=Vue.createApp(app).mount('#app')
</script>
</body>
</html>

效果如下:
在这里插入图片描述
filterBooks2 是一个 Vue 实例中定义的计算属性(computed属性)。计算属性是基于它们的响应式依赖进行缓存的。只有在相关响应式依赖发生改变时,它们才会重新求值。这意味着只要 books 数组或数组内对象的 price 属性没有发生变化,filterBooks2 将不会重新计算,从而提高应用的性能。

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

接下来,我们逐行解释一下filterBooks2

filterBooks2(){return this.books.filter(function (item){console.log("item",item) // 打印当前正在处理的书籍对象return item.price>500    // 判断当前书籍的价格是否大于500console.log("item",item) // 这行代码不会被执行,因为return语句已经结束了函数执行})
}

关键点解释

  1. filter 方法的回调函数this.books.filter(function (item){...}) 中的 function(item)filter 方法的回调函数,item 表示数组中的当前遍历到的元素。在这个场景下,item 代表 books 数组中的一个书籍对象。

  2. 判断条件 item.price>500:这是 filter 方法的核心判断逻辑,用来检查当前书籍对象的 price 属性是否大于 500。

  3. 返回值filter 方法会创建一个新数组,包含所有通过测试(即函数返回 true)的元素。在本例中,所有价格大于500的书籍对象会被包含在返回的新数组中。

  4. console.log的位置:在 return 语句之后的 console.log("item",item) 实际上是无法到达的代码,因为 return 语句执行后,函数的执行已经结束了,之后的代码将不会被执行。因此,如果你在测试或调试时需要查看item的值,需要确保 console.logreturn 语句之前。

实验二:

下面我想实现当选出的价格大于500时候,背景颜色变为橘黄色。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>v-if</title><script src="../vue 初识/vue.js"></script><style>table,tr,th,td{border: 1px solid red;border-collapse: collapse;}th ,td{width: 200px;text-align: center;height: 30px;line-height: 30px;}.co{background-color: orange;}</style>
</head>
<body>
<div id="app"><!--vue标签判断--><div v-if="this.age > 18"><div>成人</div><ul><li>江西</li><li>湖南</li><li>四川</li></ul></div><div v-else><div>儿童</div><ul><li>动漫</li><li>故事会</li><li>武侠</li></ul></div><table ><tr><th>序号</th><th>书名</th><th>价格</th><th>出版社</th></tr><!--添加样式--><tr v-for="(book,index) in filterBooks2" :class="classes"><td>{{index+1}}</td><td>{{book.name}}</td><td>{{book.price}}</td><td>{{book.publish}}</td></tr></table>
</div>
<!--vue标签控制-->
<script>const app={data(){return{use:"liqiang" ,age:18,books:[{name:"水浒传",price:3999,publish:"人民出版社"},{name:"红楼梦",price:2499,publish:"机械出版社"},{name:"西游记",price:899,publish:"西瓜出版社"},{name:"西厢记",price:499,publish:"香蕉出版社"}],classes: {co: true}}},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},filterBooks2(){return this.books.filter(function (item){console.log("item",item)return item.price>500})}}}vm=Vue.createApp(app).mount('#app')
</script>
</body>
</html>

实现效果如下:
在这里插入图片描述

根据书籍价格来改变样式,直接在模板中使用条件绑定会更加直接和高效。

小结

通过 filterBooks2 计算属性,可以得到一个包含所有价格大于 500 的书籍的数组。这是在 Vue 应用中处理数组和展示过滤结果的一种高效方法。使用计算属性可以确保数据处理逻辑简洁且可维护,同时 Vue 的响应式系统会帮你确保数据的更新能够正确反映在 UI 上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/443498.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

armbian ubuntu 小盒子安装nodejs npm vue3 环境

1.直接通过apt-get install nodejs 的版本太低了 我的是v12 我试了下 npm create vuelatest这种方式不行 所以就卸载了自动安装的nodejs apt remove nodejs 去淘宝的ftp上下载对应的版本 CNPM Binaries Mirror 我的小盒子是linux arm64版本 wget 之后解压 然后创建符号…

【C++】笔试训练(八)

目录 一、选择题二、编程题1、两种排序方法2、求最小公倍数 一、选择题 1、关于重载函数&#xff0c;哪个说明是正确的&#xff08;&#xff09; A 函数名相同&#xff0c;参数类型或个数不同 B 函数名相同&#xff0c;返回值类型不同 C 函数名相同&#xff0c;函数内部实现不…

LeetCode —— 17. 电话号码的字母组合

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

配置vite自动按需引入 vant 组件

为什么学 按需加载可以减少包体积,优化加载性能 学习内容 全局注册组件 import 需要的组件import 组件样式使用 app.use 注册组件 Tree Shaking 介绍使用 什么是 tree shaking&#xff1f; Tree shaking是一种优化技术&#xff0c;用于减少JavaScript或其他编程语言中未被使用…

EAS之WALT算法介绍

EAS调度器缘起 Linux内核的一直都使用完全公平调度器CFS(Completely Fair Scheduler)作为默认调度器&#xff0c;但是在使用中发现CFS如下几个问题。 1. CFS主要是为了服务器性能优先场景而设计的&#xff0c;主要目标是最大限度地提高系统的吞吐量&#xff0c;CFS调度的目标…

IDEA快捷键大全

提示&#xff1a; ① 主要记录我在使用 IDEA 开发的过程中用到的快捷键&#xff0c;可以提高开发速度。 ② 不一定要全部记住&#xff0c;主要是当一个参考文档&#xff0c;大家有一点印象&#xff0c;随时可以查看。 参考博客 > IntelliJ IDEA 快捷键说明大全&#xff08;官…

写静态页面——浮动练习

0、效果&#xff1a; 1、html代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>浮动…

漏洞原理XSS存贮型漏洞

漏洞原理XSS存贮型漏洞 XSS(跨站脚本攻击)是一种常见的Web安全漏洞,它允许攻击者将恶意代码注入到网页中,进而攻击用户的浏览器。存储型XSS漏洞是一种特定类型的XSS漏洞,它发生在Web应用程序中,其中用户输入的数据被存储在数据库或其他持久性存储中,并在页面重新加载时被…

【2024-01-20】 瑞幸咖啡小程序-blackbox

需要联系主页V 瑞幸咖啡小程序 登入需要过同盾滑块下单需要balckbox参数 测试 下单 过滑块 登入发短信 加密参数

CANoe实际项目中文件夹的规划

本人&#xff0c;之前设计了一个CANoe工程&#xff0c;由于工程设计之初没有设计好文档的归纳分类&#xff0c;导致文件查找起来非常费劲。 为了避免以后出现文件混乱&#xff0c;不可查找的问题&#xff0c;故特此归纳说明。 建立工程时&#xff1a; 第1步就应该设计好文档…

【Vue】2-2、MVVM 简介

一、MVVM 简介 MVVM 是 vue 实现数据驱动视图和双向数据绑定的核心原理。 MVVM 指的是 Model、View 和 ViewModel &#xff0c;它把每个 html 页面都拆分成了这三个部分 二、MVVM 工作原理 ViewModel 作为 MVVM 的核心&#xff0c;是它把当前页面的数据源&#xff08;Model…

SpringBoot+BCrypt算法加密

BCrypt是一种密码哈希函数&#xff0c;BCrypt算法使用“盐”来加密密码&#xff0c;这是一种随机生成的字符串&#xff0c;可以在密码加密过程中使用&#xff0c;以确保每次加密结果都不同。盐的使用增强了安全性&#xff0c;因为攻击者需要花费更多的时间来破解密码。 下图为…