Vue基础5

news2024/9/25 15:25:08

Vue基础5

  • 绑定样式
    • 绑定class样式
    • 绑定style样式
  • 条件渲染
  • 列表渲染
    • v-for指令
    • key的原理
      • index作为key的时候
      • id作为key的时候
      • 总结

绑定样式

  1. class样式
    写法:class="xxx“ xxx可以是字符串、对象、数组
    字符串的写法适用于:类名不确定,要动态获取
    对象写法适用于:要绑定多个样式,个数不确定,名字也不确定
    数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用
  2. style样式
    :style="{fontSize:xxx}“其中xxx是动态
    :style=”[a,b]"其中a,b是样式对象

绑定class样式

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>绑定样式</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <style>
    .basic{
      width: 400px;
      height: 100px;
      border: 1px solid black;
    }
    .happy{
      border: 5px solid red;
      background: linear-gradient(to top right,yellow 0%,orange 25%,pink 50%,yellow 75%,orange 100%);
    }
    .sad{
      background-color: #888;
      border: 5px greenyellow dashed;
    }
    .normal{
      background-color: skyblue;
    }
    .first{
      background-color: rgb(115, 231, 115);
    }
    .second{
      font-size: 30px;
      text-shadow: 2px 2px 5px pink;
    }
    .third{
      border-radius: 10px;
    }
  </style>
</head>
<body>
  <div id="root">
    <!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
    <div class="basic" :class="mood" @click="changeMood">哈喽,你好{{name}}</div>  <br>

    <!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 -->
    <div class="basic" :class="classArr">哈喽,你好{{name}}</div>  
    <button @click="deleteClass">点击删除样式</button> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input type="text" v-model="added">
    <button @click="addClass">点击添加样式</button>   <br><br>
    
    <!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定,名字也确定,但是要动态决定用不用 -->
    <div class="basic" :class="classObj">哈喽,你好{{name}}</div>
    <button @click="chooseUse(0)">使用第一个样式,不使用第二个</button>
    <button @click="chooseUse(1)">不使用第一个样式,使用第二个样式</button>
    <button @click="chooseUse(2)">两个样式都使用</button>
    <button @click="chooseUse(3)">两个样式都不使用</button>
  </div>
</body>
<script>
  new Vue({
    el:"#root",
    data:{
      name:"张三",
      mood:"normal",
      classArr:["first","second","third"],
      classObj:{
        first:true,
        second:true
      },
      added:""
    },
    methods:{
      changeMood(){
        const arr=['normal','happy','sad']
        const r=Math.floor(Math.random()*3)     //随机数[0,n)的方法
        this.mood=arr[r]
      },
      deleteClass(){
        this.classArr.shift()
      },
      addClass(){
        this.classArr.push(this.added)
      },
      chooseUse(value){
        if(value==0){
          this.classObj.first=true
          this.classObj.second=false
        }else if(value==1){
          this.classObj.first=false
          this.classObj.second=true
        }else if(value==2){
          this.classObj.first=true
          this.classObj.second=true
        }else{
          this.classObj.first=false
          this.classObj.second=false
        }
      }
    }
  })
</script>
</html>

请添加图片描述
请添加图片描述
请添加图片描述

绑定style样式

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>绑定style样式</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
  <div id="root">
    <!-- 原始写法 -->
    <div style="font-size: 40px;">你好啊</div>
    <hr>
    <!-- 绑定写法 -->
    <!-- 绑定style样式--对象写法 -->
    <div :style="styleObj">你好,{{name}}</div> <br>
    <!-- 绑定style样式--数组写法 -->
    <div :style="styleArr">欢迎来到{{school.name}}</div>

  </div>
</body>
<script>
  new Vue({
    el:"#root",
    data:{
      name:"张三",
      school:{
        name:"幸福中学"
      },
      styleObj:{
        fontSize: "40px",
        backgroundColor:"pink",
        color:"blue"
      },
      styleArr:[{
        fontSize: "50px",
        color:"red"
      },{
        backgroundColor:"skyblue",
        width:"500px",
        height:"150px"
      }]
    }
  })
</script>
</html>

请添加图片描述

条件渲染

  1. v-if 写法
    (1)v-if=“表达式”
    (2)v-else-if=“表达式”
    (3)v-else=“表达式”
    适用于:切换频率较低的场景
    特点:不展示的Dom元素直接被移除
    注意:v-if 可以和v-else-if,v-else一起使用,但要求结构不能被“打断”
  2. v-show
    写法:v-show=“表达式”
    适用于:切换频率较高的场景
    特点:不展示的dom元素未被移除,仅仅是使用样式隐藏掉
  3. 备注:使用v-if时,元素可能无法获取到,而使用v-show一定可以获取到,
    (v-if 为false时,页面上没有元素了,通过其他办法无法获取,v-show为false,页面上还有这个元素,所以可以通过其他办法获取到)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>条件渲染</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <!-- 使用v-show做条件渲染 -->
    <button @click="isShow=!isShow">点击给你惊喜</button>  <br>
    <h1 v-show="isShow">你好,{{name}}</h1>
    <!-- 使用v-if做条件渲染 -->
    <button @click="isIf=!isIf">点击就能展示</button>   <br>
    <h1 v-if="isIf">欢迎来到{{school.name}}</h1>
    <hr>

    <!-- 用v-show -->
    <div>当前的n值是:{{n}}</div>
    <button @click="n++">点我n+1</button>
    <div v-show="n===1">Angular</div>
    <div v-show="n===2">React</div>
    <div v-show="n===3">Vue</div>

    <!-- 用v-if -->
    <div>当前的d值是:{{d}}</div>
    <button @click="d++">点我d+1</button>
    <div v-if="d===1">Angular</div>
    <div v-if="d===1">React</div>
    <div v-if="d===2">Vue</div>
    <hr>

    <!-- v-if,v-else-if,v-else使用,必须紧挨着 -->
    <div>当前的a值是:{{a}}</div>
    <button @click="a++">点我a+1</button>
    <div v-if="a===1">JavaScript</div>
    <!-- v-if执行后,则不会再执行v-else-if即便v-else-if也为true,这样代码执行效率能高点 -->
    <div v-else-if="a===1">Java</div>
    <div v-else-if="a===2">Jquery</div>
    <div v-else>哈哈哈</div>
    <hr>

    <!-- template和v-if配合使用 可以不打破原本结构-->
    <div>当前的b值是:{{b}}</div>
    <button @click="b++">点我b+1</button>
    <template v-if="b===1">
      <div>html,css</div>
      <div>JavaScript</div>
      <div>Dom,Bom</div>
    </template>
  </div>
</body>
<script>
  new Vue({
    el:"#app",
    data:{
      name:"张三",
      isShow:false,
      isIf:false,
      school:{
        name:"幸福中学"
      },
      n:0,
      d:0,
      a:0,
      b:0
    },

  })
</script>
</html>

请添加图片描述
请添加图片描述
请添加图片描述

列表渲染

v-for指令

v-for指令:

  1. 用于展示列表数据
  2. 语法:v-for=“(item,index) in xxx” :key=“yyy”
  3. 可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>列表渲染</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <!-- 遍历数组 -->
    <h2>人员列表(遍历数组)</h2>
    <ul>
      <li v-for="(p,index) in people" :key="p.id">
        {{index}}-{{p.name}}-{{p.age}}
      </li>
    </ul>

    <!-- 遍历对象 -->
    <h2>王老师信息(遍历对象)</h2>
    <ul>
      <li v-for="(value,k) of wang" :key="k">
        {{k}}-{{value}}
      </li>
    </ul>
    
    <!-- 遍历字符串 -->
    <h2>hello遍历(少用)</h2>
    <ul>
      <li v-for="(s,index) of str" :key="index">
        {{index}}-{{s}}
      </li>
    </ul>

    <!-- 遍历指定次数 -->
    <h2>数次数(少用)</h2>
    <ul>
      <li v-for="(number,index) of 6" :key="index">
        索引:{{index}}-数值:{{number}}
      </li>
    </ul>
  </div>
</body>
<script>
  new Vue({
    el:"#app",
    data:{
      people:[
        {id:"001", name:"张三", age:"18"},
        {id:"002", name:"李四", age:"19"},
        {id:"003", name:"王五", age:"20"}
      ],
      wang:{
        name:"王立春",
        merried:"已婚",
        sex:"女"
      },
      str:"hello"
    }
  })
</script>
</html>

请添加图片描述

key的原理

index作为key的时候

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>key的原理</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <ul>
      <li v-for="(p,index) in people" :key="index">
        {{p.name}}-{{p.age}} <input type="text">
      </li>
    </ul>
    <button @click="add">在列表最前面添加一个老刘</button>
  </div>
</body>
<script>
  new Vue({
    el:"#app",
    data:{
      people:[
        {id:"001",name:"张三",age:18},
        {id:"002",name:"李四",age:19},
        {id:"003",name:"王五",age:20}
      ]
    },
    methods:{
      add(){
        var obj={id:"004",name:"老刘",age:30}
        this.people.unshift(obj)
      }
    }
  })
</script>
</html>

若在列表中同时存在输入框时会出现以下问题:
请添加图片描述
出现问题的原因是Vue在生成虚拟dom时候使用对比(diff)算法,下面是运行过程图:
请添加图片描述

id作为key的时候

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>key的原理</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <ul>
      <li v-for="(p,index) in people" :key="p.id">
        {{p.name}}-{{p.age}} <input type="text">
      </li>
    </ul>
    <button @click="add">在列表最前面添加一个老刘</button>
  </div>
</body>
<script>
  new Vue({
    el:"#app",
    data:{
      people:[
        {id:"001",name:"张三",age:18},
        {id:"002",name:"李四",age:19},
        {id:"003",name:"王五",age:20}
      ]
    },
    methods:{
      add(){
        var obj={id:"004",name:"老刘",age:30}
        this.people.unshift(obj)
      }
    }
  })
</script>
</html>

请添加图片描述
就能得到正确结果,其运行过程如下所示:
请添加图片描述

总结

面试题:Vue、React中的key有什么作用? (key的内部原理)

  1. 虚拟DOM中key的作用:
    key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
  2. 对比规则:
    (1)旧虚拟DOM中找到了与新虚拟DOM中相同的key:
    ①若虚拟DOM中内容没变,直接使用之前的真实的DOM
    ②若虚拟DOM中的内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM
    (2)旧虚拟DOM中未找到与新虚拟DOM中相同的key
    创建新的真实DOM,随后渲染到页面
  3. 用index作为key可能会引发的问题:
    (1)若对数据进行:逆序添加、逆序删除等破坏顺序操作:
    会产生没有必要的真实DOM更新 =》页面效果没问题,但效率低
    (2)如果结构中还包含输入类的DOM:
    会产生错误DOM更新==》页面有问题
  4. 开发中如何选择key?
    ①最好使用每条数据唯一标识作为key,比如id,手机号、身份证号、学号等唯一值。
    ②如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用index作为key是没有问题的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做一个小程序商城,需要多少钱

如何做一个小程序商城&#xff0c;需要多少钱&#xff1f; 操作像玩消消乐那么简单&#xff01; 费用是一年1998元至3498元。免300元认证费。买两年用四年。 日均花费不到2元就能搭建一个小程序商城。 下面分享的是自建小程序商城的教程: 1、进入第三方小程序商城制作平台…

Mybatis-Plus中getOne方法获取最新一条数据

Mybatis-Plus中getOne方法获取最新一条数据一、代码1、Controller2、Service3、效果一、代码 1、Controller GetMapping("/queryNewProduct")public ProductDTO queryNewProduct(RequestParam("type") String type) {return opProductService.queryNewPro…

Python基础(二):不同系统安装Python3

​​​​​​​ 文章目录 不同系统安装Python3 一、Anaconda安装与使用 1、下载 2、安装 3、配置 4、使用 5、常用命令 二、原生Python安装 三、在Linux环境Python安装 不同系统安装Python3 14天学习训练营导师课程&#xff1a;杨鑫《Python 自学编程基础》杨鑫《 P…

HTML学生个人网站作业设计——中华美食(HTML+CSS) 美食静态网页制作 WEB前端美食网站设计与实现

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

JVM 中类加载的链接与初始化

类加载系统&#xff0c;主要有以下部分 加载链接 验证准备解析初始化 它们每部分都做些什么事情呢&#xff1f; 加载 (2条消息) JVM 双亲委派模型_兜兜转转m的博客-CSDN博客 链接 链接-验证 一般验证部分&#xff0c;IDEA已经帮我们规范了。 验证是连接阶段的第一步&…

第二章 数据库设计

数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库极其应用系统&#xff0c;有效存储数据&#xff0c;满足用户信息要求和处理要求。 数据库设计的步骤 ⒈需求分析阶段 收集和分析用户需…

怎么搭建属于自己的网站?

搭建属于自己的网站已经不是什么新鲜事了&#xff0c;有些人甚至搭建一个网站用来做自己的简历。搭建网站对一些懂代码的人来说也是比较简单的&#xff0c;就算不精通也能下载源代码模板。那如果不太懂代码的小伙伴&#xff0c;又怎么搭建属于自己的网站呢&#xff1f; 一、善…

SpringBoot 代码混淆真香,再也不用担心反编译代码泄露...

编译 简单就是把代码跑一哈&#xff0c;然后我们的代码 .java文件 就被编译成了 .class 文件 反编译 就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来&#xff0c;可以看到你的代码写的啥。 比较常用的反编译工具 JD-GUI &#xff0c;直接把编译好的jar丢进…

MySQL 进阶 图文详解InnoDB储存引擎

前言 SQL 语句的最终执行者是存储引擎。存储引擎在经解析器、优化器处理后被执行器调用其接口执行优化后的执行计划。MySQL 存储引擎包括 InnoDB、Myisam、Memory、Archive、CSV 存储引擎等&#xff0c;其中最常用也是MySQL 默认的存储引擎是 InnoDB。 写入缓冲池&#xff08;…

cyclictest生成结果统计图

在用cyclictest测试实时性的时候通过输出的结果能清晰的看到最大值、最小值平均值&#xff0c;但具体的分布情况无法直接得到。 本文记录根据网上的博客实际测试结果。 1、先在开发板上运行测试程序 ./cyclictest -l 1000000 -m -Sp99 --policyfifo -h 25000 -q >output 得…

华为机试 - 高矮个子排队

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 现在有一队小朋友&#xff0c;他们高矮不同&#xff0c;我们以正整数数组表示这一队小朋友的身高&#xff0c;如数组{5,3,1,2,3}。 我们现在希望小朋友排队&#xff0c;以“高”“矮”“高”“矮”顺…

专利变更需要哪些材料

一、专利变更需要哪些材料 专利权人变更专利的&#xff0c;需要提供著录项目变更请求书、著录项目变更证明材料、专科权人身份证明等材料。 《专利法实施细则》 第八十九条 国务院专利行政部门设置专利登记簿&#xff0c;登记下列与专利申请和专利权有关的事项&#xff1a; …

聚观早报|苹果高管称ipad在走下坡路;罗永浩新公司完成融资

今日要闻&#xff1a;苹果高管称ipad在走下坡路&#xff1b;罗永浩新公司完成融资&#xff1b;谷歌发布最新可持续发展成果&#xff1b;比亚迪新能源车涨价&#xff1b;惠普宣布裁员6千人 前苹果高管称ipad在走下坡路 据报道&#xff0c;前苹果公司高管让路易斯加塞近日表示&am…

无符号、有符号数运算判溢出

目录 无符号数的运算&#xff08;溢出看CF&#xff09; 有符号数运算&#xff08;溢出看OF&#xff09;&#xff08;都是补码进行运算&#xff0c;因为补码的符号位可以直接参与运算一套电路就ok&#xff09; 例题 第一题 第二题 无符号数的运算&#xff08;溢出看CF&#…

会议信息管理系统SSM记录(六)

目录&#xff1a; &#xff08;1&#xff09;会议预定1 &#xff08;2&#xff09;会议预定2 &#xff08;3&#xff09;会议预约3 &#xff08;4&#xff09;会议预定4 &#xff08;1&#xff09;会议预定1 创建MeetingController&#xff1a; //跳转预定会议页面Request…

嵌入式面试题

1、写一个程序判断电脑是大端字序还是小端字序&#xff08;加量不加价&#xff09; #include <stdio.h> #include <arpa/inet.h> typedef unsigned char byte; typedef unsigned int word; int main(int argc, char *argv[]) {word val32 0x11223344;byte val8 …

业务流程管理包括什么

​什么是业务流程管理&#xff1f; 业务流程管理 (BPM)提供了一些用于发现、建模、分析、衡量、改进和优化业务策略及流程的方法。 在知名企业中&#xff0c;麦当劳是因为业务流程管理而获得成功的企业之一&#xff0c;标准化业务流程制度是麦当劳成功的关键。 麦当劳为了保证…

CAS号:2578-57-6,H2N-PG-OH

脯氨酸酶的底物(脯氨酸二肽酶)。 编号: 116803中文名称: 二肽Pro-Gly英文名: Pro-GlyCAS号: 2578-57-6单字母: H2N-PG-OH三字母: H2N-Pro-Gly-COOH氨基酸个数: 2分子式: C7H12N2O3平均分子量: 172.18精确分子量: 172.08等电点(PI): 6.11pH7.0时的净电荷数: -0.02平均亲水性: -疏…

MCE | 为什么肥胖经常被“针对”?

近年来&#xff0c;肥胖问题受到越来越多的关注&#xff0c;肥胖不只影响美丽身材&#xff0c;过度肥胖还可能导致肥胖症&#xff0c;这是很多疾病的高风险因素。所以肥胖是一种病&#xff1f;肥胖的标准是什么&#xff1f;别急&#xff0c;等小编慢慢道来。 认识肥胖症 (Obesi…

大数据毕设选题 - 深度学习口罩佩戴检测系统(python OpenCV YOLO)

文章目录0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存5 训练6 实现效果6.1 pyqt实现简单GUI6.2 图片识别效果6.3 视频识别效果6.4 摄像头实时识别7 最后0 前言 &#x1f525; Hi&#xff0c…