Vue2(三):绑定样式、条件渲染(v-if,v-show)、列表渲染(v-for)、key的原理、列表过滤、列表排序

一、绑定样式

1.绑定class样式

(1)字符串写法

适用于:样式类名不确定,需要动态获取。

 <div id="root"><div class="basic" :class="mood" @click="changeMood">test</div><!-- class是原本的,:class是在绑定事件,去vue那里找mood --></div><script type="text/javascript">new Vue({el:'#root',data:{mood:'normal'},methods:{changeMood(){this.mood="happy"}}})

点击盒子之后从normal到happy,但是sad没用上啊

methods:{changeMood(){const arr=['happy','normal','sad']const i=Math.floor(Math.random()*3)//    Math.random()里面不用填(0,1),就是生成[0,1)的数,*3[0,3)this.mood=arr[i]}}

把三种心情装数组里随机生成

(2)数组写法

 数组写法适用于:要绑定样式个数和名字都不确定

 <div class="basic" :class="arr"></div></div><script type="text/javascript">new Vue({el:'#root',data:{mood:'normal',arr:['a1','a2','a3']},

(3)对象写法

适用于:要绑定样式个数和名字都确定,要动态决定。

<div id="root"><div class="basic" :class="obj"></div></div><script type="text/javascript">new Vue({el:'#root',data:{mood:'normal',obj:{a1:false,a2:true}},

2.绑定style样式(用的不多)

(1)对象写法

<div id="root"><div class="basic" :style="styleObj">hh</div></div><script type="text/javascript">new Vue({el:'#root',data:{styleObj:{fontSize:'40px',color:'red'//这里面:前面的都得是存在的东西,不能随便写}},

(2)数组写法(比较少用)

<div id="root"><div class="basic" :style="[styleObj,styleObj2]">hh</div></div><script type="text/javascript">new Vue({el:'#root',data:{mood:'normal',styleObj:{fontSize:'40px'},styleObj2:{color:'red'}},

二、条件渲染

1.v-show

适用于:切换频率较高的场景。(不会动DOM树,只是隐藏,相当于添加display:none)
特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。这是因为v-if会一不小心把标签直接从页面上干掉,而v-show不会干掉,只会隐藏。

<div id="root"><h3 v-show="a">欢迎来到{{name}}</h3><!-- v-show:false==display:none --></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{name:'尚硅谷',a:false}

2.v-if(结构都给干掉了)

(1).v-if=“表达式”
(2).v-else-if=“表达式”
(3).v-else(后面不跟条件
适用于:切换频率较低的场景。
特点:不展示的DOM元素直接被移除。
注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”,几个div连着一起写。

<div id="root"><h3>当前的n值为:{{n}}</h3><button @click="n++">点我n++</button><div v-if="n===1">1</div><div v-else-if="n===2">2</div><!-- 只能成立一个,直接跳出循环,但是好多if叠在一起不一定只能同时成立一个 --><div v-else>3</div></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{n:1},

实现点击按钮n++,n=1跳出1,等于2跳出2,等于其他跳出3

template只能配合v-if使用,可以把很多h2包起来一起实现,不破坏结构(想要n===1时跳出三个h2)

三、列表渲染!!!

1.v-for

遍历数组:

只要用遍历去生成了多个相同的结构必须得设置key去区分

一个形参:
<div id="root"><ul><h2>人员列表</h2><li v-for="p in person" :key="p.id">{{p.name}}-{{p.age}}<!-- p不用去下边找,也可以是形参 --></li><!-- 让vue来做遍历 --></ul></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{person:[{id:'001',name:'张三',age:'18'},{id:'002',name:'李斯',age:'19'},{id:'003',name:'王五',age:'17'}]},
多个形参:
<li v-for="(p,index) in person" :key="index">{{p}}-{{index}}<!-- p不用去下边找,也可以是形参 --></li>

遍历对象:

<ul><h2>汽车列表</h2><li v-for="(value,k) in car" :key="k">{{k}}-{{value}}</li></ul></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{car:{name:'奥迪',value:'80万'}}//name-奥迪value-80万

2.key的作用与原理!!!

面试题:key在vue中写了怎么处理?写了用什么值比较好?react、vue中的key有什么作用?(key的内部原理)

1、 虚拟DOM中key的作用:
key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】, 随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较(diff算法),比较规则如下:

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?:
(1)最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
(2)如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用index作为key是没有问题的。

key相当于人的身份证号,如果没有写key,默认就是index

当我们把老刘添加到第一位

methods: {add() {const p = { id: 004, name: '老刘', age: 90 };this.persons.unshift(p);}},

这个图中,以前的虚拟dom转换成过真实dom,生成新的虚拟dom之后,就和旧的进行对比,首先对比key=0的,发现新的是老刘,旧的是张三不一样,但是后面input框是一样的(输入的数据存在的真实dom中,虚拟的都是text input框),而且旧的input框生成过真实dom了就直接拿下来input,老刘是新的直接下来,导致老刘后面是张三的框,到了王五那里,旧的没有key=3,所以王五和王五的新框都直接下来(所以王五的input是新的)

这个就是用index当key出现了错误,而且效率低,张三、李四、王五都是上边掉下来的都没复用

四、列表过滤-模糊搜索

1.数据监视实现

 <div id="root"><ul><h2>人员列表</h2><input type="text" placeholder="请输入名字" v-model=keywords><li v-for="p in fliperson" :key="p.id">{{p.name}}-{{p.age}}-{{p.sex}}</li></ul></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{keywords:'',person:[{id:'001',name:'周冬雨',age:'18',sex:'女'},{id:'002',name:'马冬梅',age:'19',sex:'女'},{id:'003',name:'周杰伦',age:'17',sex:'男'},{id:'004',name:'王伦',age:'17',sex:'男'}],fliperson:[]},watch:{keywords:{immediate:true,//没输入就是空串,打开就自动运行了handler(newValue){this.fliperson=this.person.filter((p)=>{// return p.name包含valreturn p.name.indexOf(newValue)!==-1})}}}})</script>

2.computed实现

计算属性拿不到用户输入的东西val

<div id="root"><ul><h2>人员列表</h2><input type="text" placeholder="请输入名字" v-model=keywords><li v-for="p in filperson" :key="p.id">{{p.name}}-{{p.age}}-{{p.sex}}</li></ul></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{keywords:'',person:[{id:'001',name:'周冬雨',age:'18',sex:'女'},{id:'002',name:'马冬梅',age:'19',sex:'女'},{id:'003',name:'周杰伦',age:'17',sex:'男'},{id:'004',name:'王伦',age:'17',sex:'男'}],},computed:{filperson(){return this.person.filter((p) => {return p.name.indexOf(this.keywords)!==-1;})}}})</script>

下去得好好看一下,好多方法都忘了

五、列表排序

每次点击sortType,计算属性都重新进行,原顺序能显示出来是person我们一直没动,动的是filperson

<body><div id="root"><ul><h2>人员列表</h2><input type="text" placeholder="请输入名字" v-model=keywords><button @click="sortType=2">年龄升序</button><button @click="sortType=1">年龄降序</button><button @click="sortType=0">原顺序</button><li v-for="p in filperson" :key="p.id">{{p.name}}-{{p.age}}-{{p.sex}}</li></ul></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{keywords:'',sortType:0,person:[{id:'001',name:'周冬雨',age:'18',sex:'女'},{id:'002',name:'马冬梅',age:'19',sex:'女'},{id:'003',name:'周杰伦',age:'17',sex:'男'},{id:'004',name:'王伦',age:'17',sex:'男'}],},computed:{filperson(){const arr= this.person.filter((p) => {//在这里筛选完之后立马返回去了,筛选完就排序才对return p.name.indexOf(this.keywords)!==-1;})if(this.sortType){arr.sort((p1,p2)=>{return this.sortType===1?p2.age-p1.age:p1.age-p2.age})}return arr}}})</script>
</body>

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

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

相关文章

Linux(openEuler)部署SpringBoot前后端分离项目(Nginx负载均衡)

假如数据库在本地&#xff0c;没有放在Linux中 1.先把数据库中root的主机改成% 2.项目中的数据库链接配置换成本机ip 3.打包 4.把打包好的jar包放到Linux中 一般把jar包放到opt下 5.把前端部分拷贝到Linux的nginx中 5.1在package.json中修改build的值为图中这样 5.2同时由于在…

学点儿Java_Day9_多图带你搞懂Java访问修饰符

1 前言 在学习Java访问修饰符的作用及相应的效果时&#xff0c;看到了像下面这样的图 表达的内容基本都是一致的&#xff0c;但是带着一些疑惑经过一番“深入”学习后&#xff0c;我觉得这样划分不够细致&#xff0c;把我的总结分享一下。 2 多图带你搞懂Java访问修饰符 …

基于springboot的班级综合测评管理系统的设计与实现

目录 背景 技术简介 系统简介 界面预览 背景 随着电子技术的广泛渗透和迅猛发展&#xff0c;网络化的管理平台得到了大规模的应用。众多的公共机构和商业组织都在积极推进管理流程的电子化转型&#xff0c;班级的综合评价管理系统亦是如此&#xff0c;从传统的手工操作转变…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

物联网和工业物联网的区别——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff08;IoT&#xff09;和工业物联网&#xff08;IIoT&#xff09;作为现代科技的重要分支&#xff0c;正在逐渐渗透到我们的日常生活和工业生产中。它们的应用范围广泛&#xff0c;涵盖了从智能家居到自动化工厂的多个领域。…

存内领域前沿,基于忆阻器的存内计算----浅析忆阻存内计算

目录 一.概念浅析 1.存内计算 2.忆阻器 3.基于忆阻器的存内计算 二.忆阻器的分类 1.磁效应忆阻器 2 .相变效应忆阻器 3 .阻变效应忆阻器 三.基于忆阻器的存内计算原理 1. 利用二值忆阻器的布尔计算 3.1R-R 逻辑运算 3.2V-R 逻辑运算 3.3V-V 逻辑运算 2. 利用模拟…

Harbor高可用(nginx和keepalived)

Harbor高可用&#xff08;nginx和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;nginx和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设置时…

Apipost智能Mock功能详解

在接口开发过程中&#xff0c;Mock功能可以帮助开发者快速测试和验证接口的正确性和稳定性&#xff0c;以便快速迭代和修复问题。Apipost推出智能Mock功能&#xff0c;可以在智能期望中填写一些触发条件&#xff0c;开启后&#xff0c;Apipost会根据已设置的触发条件&#xff0…

新能源汽车小三电系统

小三电系统 新能源电动汽车的"小三电"系统&#xff0c;一般指车载充电机(OBC)、车载 DC/DC 变换器&#xff0c;和高压直流配电盒(PDU)。一辆纯电动汽车一般配备一台OBC 和一台车载 DC/DC 变换器。OBC将外部输入的交流电转化为直流电输出给电池&#xff0c;DC/DC衔接…

Android studio开发中Virtual Device模拟器的设置和屏幕错位等问题

Android SDK开发中Virtual Device模拟器的设置和使用 本文介绍android studio2023 3.1.13版本中模拟器的设置和在cordova开发中的运行方法 对于老版android studioAVD模拟器的使用&#xff0c;参见&#xff1a;Android SDK手机应用开发中第三方模拟器、真机运行方法以及AVD模拟…

Linux下进程的调度与切换

&#x1f30e;进程的调度与切换 文章目录&#xff1a; 进程的调度与切换 进程切换 进程调度       活动状态进程队列       位图判断       过期队列 总结 前言&#xff1a; 在Linux操作系统中&#xff0c;进程的调度与切换是操作系统核心功能之一&#xff…

力扣题库27题移除元素(c语言)

解法&#xff1a; int removeElement(int* nums, int numsSize, int val) {int src0,dst0;while(src<numsSize){if(nums[src]val){src;}else{nums[dst]nums[src];src;dst;}}return dst; }

2024年NOC大赛创客智慧(西瓜创客)图形化编程真题模拟试卷包含答案

详细题目看顶部资源 答案解析 一、选择题 1、C 该段代码是将变量的值翻倍,运行之后变量的值是之前的两倍。变量的值是否改变取决于初始值是否为 0,所以船都不正确 2、C A 透项为让角色说话,不可以广播消息: B 选项为播放一段声音,不可以广播消息; C透项为广播消息,正确: …

网络基础(一)初识

1、计算机网络背景 1.1、网络发展 1. 独立模式: 计算机之间相互独立&#xff1b; 2. 网络互联: 多台计算机连接在一起&#xff0c;完成数据共享&#xff1b; 3. 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 4. 广域网WAN: 将远隔千里的计算机都连在一起;…

【MySQL】基本查询(1)

【MySQL】基本查询&#xff08;1&#xff09; 目录 【MySQL】基本查询&#xff08;1&#xff09;表的增删改查Create单行数据 全列插入多行数据 指定列插入插入否则更新替换 RetrieveSELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件英语不…

Mysql---DML

文章目录 目录 一.DML概述 注入数据&#xff08; Insert&#xff09; 替换数据&#xff08;replace&#xff09; 删除数据 &#xff08;delete&#xff09; 修改数据 &#xff08;update&#xff09; 查询数据 &#xff08;select&#xff09; 二. 多表连接查询 内连接 子…

计算机二级Python题目3

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle绘图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 a,b,ceval(input()) ls[] for i in …

视频桥接芯片#LT8912B适用于MIPIDSI转HDMI+LVDS应用方案,提供技术支持。

1. 概述 Lontium LT8912B MIPI DSI 转 LVDS 和 HDMI 桥接器采用单通道 MIPI D-PHY 接收器前端配置&#xff0c;每通道 4 个数据通道&#xff0c;每个数据通道以 1.5Gbps 的速度运行&#xff0c;最大输入带宽高达 6Gbps。 对于屏幕应用&#xff0c;该桥接器可解码 MIPI DSI 18bp…

docker安装Milvus

docker安装Milvus 拉去CPU版本的milvus镜像 $ sudo docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 mkdir -p milvus/conf cd milvus/conf ls wget https://raw.githubusercontent.com/milvus-io/milvus/v0.1…

探索编程迷宫:选择你的职业赛道

在现代科技的浪潮中&#xff0c;程序员的职业赛道就像是一座迷宫&#xff0c;充满着前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;以及数据科学的神秘密室。这个迷宫中&#xff0c;每一条通道都充满了挑战和机遇&#xff0c;而每一个行走其中的人都在寻找着属于自己的…