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    // 判断当前书籍的价格是否大于500
        console.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>

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

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

实验三

下面我希望显示所有书籍并且,价格大于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 books" :class="book.price>500?'co':''">
      <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:99,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>

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

针对三元运算符进行详解:
在Vue.js中,使用:class绑定时候,如果条件判断需要根据结果选择不同的类名,通常会用到三元运算符,格式如下:

:class="condition ? 'trueClassName' : 'falseClassName'"

这里的condition是你要检查的条件,trueClassName是当条件为真(true)时要添加的类名,而falseClassName是条件为假(false)时要添加的类名。在这种情况下,类名是字符串类型的值,因此它们需要被引号(单引号'或双引号")包围。

在例子中:

:class="book.price>500 ? 'co' : ''"
  • book.price > 500为真时,将为元素添加'co'类名。这里的'co'就是一个字符串,代表某个具体的CSS类,用来改变该<tr>元素的样式。此类名外必须用引号包围,因为它是一个字符串。
  • 当条件为假时,元素不会添加任何类名,因此使用一对空引号''代表空字符串,也就是说,不添加任何类名。这对空引号同样表明这里是一个字符串类型的值,虽然它是空的。

引号的使用是因为CSS类名在JavaScript(因此也包括Vue.js模板表达式中)是作为字符串处理的,不管是具有实际名称的字符串,还是一个空字符串。不使用引号的话,JavaScript会试图将其解释为变量或其他表达式,从而引发语法或逻辑错误。

小结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【vim 学习系列文章 3.2 -- vim 删除 空格】

文章目录 vim 删除行尾空格 vim 删除行尾空格 在代码开发的过程中&#xff0c;经常会遇到行尾有空格的现象&#xff0c;如下&#xff1a; 我们可以在 .vimrc 中通过map 命令来映射删除行尾空格的快捷键&#xff0c;如下&#xff1a; map d<space> :%s/\s*$//g <cr…

3分钟彻底搞懂Web UI自动化测试之【POM设计模式】

为什么要用POM设计模式 前期&#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本&#xff08;以快递100网站登录举例&#xff09;&#xff1a; import timefrom selenium import webdriver from selenium.webdriver.common.by import Bydriver …

尚硅谷Ajax笔记

一天拿下 介绍二级目录三级目录 b站链接 介绍 ajax优缺点 http node.js下载配置好环境 express框架 切换到项目文件夹&#xff0c;执行下面两条命令 有报错,退出用管理员身份打开 或者再命令提示符用管理员身份打开 npm init --yes npm i express请求 <script>//引…

【Docker】使用VS创建、运行、打包、部署.net core 6.0 webapi

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

《Pandas 简易速速上手小册》第6章:Pandas 时间序列分析(2024 最新版)

文章目录 6.1 时间序列数据基础6.1.1 基础知识6.1.2 重点案例&#xff1a;股票市场分析6.1.3 拓展案例一&#xff1a;温度变化分析6.1.4 拓展案例二&#xff1a;电商平台日销售额分析 6.2 日期与时间功能6.2.1 基础知识6.2.2 重点案例&#xff1a;活动日志分析6.2.3 拓展案例一…

022 do while循环

什么是do while循环 int i 0; do {System.out.println(i);i; } while (i < 100); 具体使用场景 int i; Scanner scanner new Scanner(System.in); do {System.out.print("请输入一个整数&#xff0c;如果为负数则结束循环&#xff1a;");i scanner.nextInt(…

基于极大似然法和最小二乘法系统参数辨识matlab仿真,包含GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 1.极大似然法系统参数辨识 2. 最小二乘法系统参数辨识 5.完整程序 1.程序功能描述 分别对比基于极大似然法的系统参数辨识以及基于最小二乘法的系统参数辨识&#xff0c;输出起参数辨识收敛…

Scrum敏捷研发管理全流程/scrum管理工具

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新…

二进制、原码、反码、补码

一、 二进制在运算中的说明 二、原码、反码、补码 1、二进制的最高位是符号位&#xff1a;0表示正数&#xff0c;1表示负数 2、正数的原码、反码、补码相同&#xff08;三码合一&#xff09; 3、负数的反码它的原码符号位不变&#xff0c;其它位取反&#xff08;0变1,1变0&…

【leetcode】20. 有效的括号

有效的括号 题目链接 // 栈结构 typedef char valuetype; typedef struct {valuetype* arr;int top;int capacity; } Stack;void Init(Stack* stack);void Push(Stack* stack, valuetype value); void Pop(Stack* stack);valuetype Top(Stack* stack); int Size(Stack* stack…

数据结构+算法(第06篇):再不会“降维打击”你就Out了!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

各类型判空操作

开发中经常遇到需要判空的地方&#xff0c;比如对字符串进行判空操作。 而有时候工具包太多不知道用哪个。 就像下图&#xff0c;光一个 StringUtils 就有十几个包弹出来。 怎么选&#xff1f; 其实用哪个都行。 最重要的是&#xff1a; 有一套自己用的顺手的工具。 或者…

Java基础数据结构之ArrayList源码分析

一.几个常量 这是默认容量 这两个是共享的空对象 这是真正存储元素的地方&#xff0c;现在还没有分配内存 二.构造方法 这是一个无参构造方法&#xff0c;此时让存储元素的数组指向了那个默认容量数组&#xff0c;此时该数组是一个空数组&#xff0c;长度为0. 这是给定初始容量…

C#使用OpenCvSharp4库读取电脑摄像头数据并实时显示

一、OpenCvSharp4库 OpenCvSharp4库是一个基于.Net封装的OpenCV库&#xff0c;Github源代码地址为&#xff1a;https://github.com/shimat/opencvsharp&#xff0c;里面有关于Windows下安装OpenCvSharp4库的描述&#xff0c;如下图所示&#xff1a; 二、C#使用OpenCvSharp4库…

杂题——试题-算法训练-P0604-runaround数

分析&#xff1a; 题目有三个关键点&#xff1a; 一&#xff1a;结束时&#xff0c;回到起始位置&#xff08;比较结束时和起始时的下标位置是否相同&#xff09;二&#xff1a;该整数的所有数字都必须遍历一遍&#xff0c;且只能遍历一遍&#xff08;把遍历过的数字做个标记&a…

【前端-VUE+TS】Vue3组件化-知识补充(六)

一. 动态组件 比如我们现在想要实现了一个功能&#xff1a; 点击一个tab-bar&#xff0c;切换不同的组件显示&#xff1b; 案例截图 这个案例我们可以通过两种不同的实现思路来实现&#xff1a; 方式一&#xff1a;通过v-if来判断&#xff0c;显示不同的组件&#xff1b;方式二…

周润发节俭,排队买廉价盒饭,身价56亿由此省出。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 周润发裸捐数十亿&#xff0c;但生活中的他却极度节俭。每一分…

基于SSM的高校社团管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 我欲乘风归去 又恐琼楼玉宇 高处不胜寒 -苏轼 目录 一、项目简介 二、开发技术与环境配置 2.1 SSM框架 2.2 …

UGUI中Text和TextMeshPro实现图文混排方式

一些项目中实现图文混排是自定义一个脚本去继承Text类&#xff0c;然后文本中用富文本的方式进行图片和超链接的定义&#xff0c;在代码中用正则表达式匹配的方式把文本中图片和超链接给替换&#xff0c;如下&#xff1a; TextMeshPro实现是生成SpriteAsset进行图文混排的&…

杂题——试题 算法训练 试题3971 丑数

分析&#xff1a; 判断一个数 n 是否是丑数&#xff0c;分成三个部分 1、寻找因数&#xff0c;从2遍历到 n&#xff0c;如果该数 i 是 n 的因数&#xff0c;就进入下一步2、判断 i 是否是质数&#xff0c;这部分代码直接套用即可&#xff0c;见得较多3、最后判断 i 是否等于2或…