绑定class,条件渲染,列表过滤,列表排序

目录​​​​​​​

绑定class

条件渲染

列表过滤

列表排序

绑定class

<div class="normal" :class="mood" @click="changename">111{{name}}</div><div class="normal" :class="arr">111{{name}}</div>

本来class只能出现一个,但是现在:class代表绑定,后面是表达式就行

dom操作通过vue实例里data来动态绑定

1 如果class后是对象,说明参数个数和名字都确定

2 后是数组,说明动态绑定

3 后是字符串

<script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#root',data: {name: 'what',mood: 'normal',arr: ['happy', 'sad']},methods: {changename() {alert('i change')this.mood = 'happy'// 不用操作dom,只要把与vue关联的数据改了,让vue来操作dom}}// vm.arr.shift()移除数组第一个元素})</script>

条件渲染

v-show后面是表达式,并且是display为none不是真的删除

但是v-if后面表达式,则没的很彻底

<h2 v-if="false">111</h2>
<body><div id="root"><h2 v-show="1===3">333{{name}}</h2></div></body>
<script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#root',data: {name: 'fansi'}})</script>

简单交互,点击后n自增

<h2>{{n}}</h2>
<h2 v-show="1===1" @click="n++">{{name}}dianwo</h2>const vm = new Vue({el: '#root',data: {name: 'fansi',n: 0}})
 <div id="root"><h2>{{n}}</h2><button @click="n++">dianwo{{n}}</button><h2 v-show="n===1">react</h2><h2 v-show="n===2">angular</h2><h2 v-show="n===3">vue</h2>

很高的变化频率用v-show

v-else-if

v-else后面别跟条件

如果用v-if,v-else-if,v-else则三者之间不能被打断,即插入别的,不然打断后面的都不奏效

如果想一系列同时出现,用template,不影响结构

<template v-if="1===1"><h2>11</h2><h2>12</h2><h2>13</h2></template>

但是template只能配合v-if不能配合v-show

v-for

v-for加在谁身上遍历谁,数组长度多长就多少次

总结:

1 用于展示列表数据

2 v-for="(item,index) in xxx" :key="xxx"

3 可遍历:数组,对象,字符串

<body><div id="root"><h2>人员列表</h2><ul><li v-for="p in persons" :key="p.id"><!-- 让每个li都有了唯一的标识? -->{{p.name}}-{{p.age}}姓名-年龄</li><li v-for="(p,index) in persons" :key="index">{{p.name}}--{{p.age}}<!-- 这里key其实只要找一个对每次生成的标识都会不一样的东西就行 --></li><!-- v帮你循环,person理解为形参,persons长度是多少就能生成多少个li --></ul><!-- 遍历对象 --><ul><li v-for="p in persons" :key="p.id"><!-- 让每个li都有了唯一的标识? -->{{p.name}}-{{p.age}}姓名-年龄</li><li v-for="(value,k) of car" :key="k"><!-- 这里in和of都行,先收到的是value -->{{k}}--{{value}}<!-- 这里key其实只要找一个对每次生成的标识都会不一样的东西就行 --></li><!-- v帮你循环,person理解为形参,persons长度是多少就能生成多少个li --></ul><!-- 测试遍历指定次数 --><ul><li v-for="(a,b) of 5" :key="b"><!-- 让每个li都有了唯一的标识? -->{{a}}-{{b}}<!-- a就是从1开始计数,b从0开始计数但是b就是index索引值 -->姓名-年龄</li><li v-for="(value,k) of car" :key="k"><!-- 这里in和of都行,先收到的是value -->{{k}}--{{value}}<!-- 这里key其实只要找一个对每次生成的标识都会不一样的东西就行 --></li><!-- v帮你循环,person理解为形参,persons长度是多少就能生成多少个li --></ul></div></body>
<script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#root',data: {persons: [{ id: '001', name: 'zhangsn', age: 18 },{ id: '002', name: 'lisi', age: 18 },{ id: '003', name: 'wangw', age: 20 }],car: {name: 'aodi',price: '70',color: 'pink'}}})</script>

如果key写了该怎么处理:虚拟dom对比算法(diff)

如果没写key该怎么处理:将遍历时候的索引值index自动作为key

react,vue中的key有什么用:
1 虚拟dom中key作用:数据变化时候,vue根据新数据生成新的虚拟dom
如果旧的虚拟dom找到与新的虚拟dom相同的key,如果内容没变直接使用已经转的真实dom(复用dom节点)
-对比key一样但内容不一样,还有就是旧的没找到,直接创新的

将index作为key:如果对数据进行逆序添加,逆序删除等破坏顺序操作,产生没有必要的dom更新,效率低;一旦有输入类dom(input等),就会串行


最好使用能够唯一标识的作为key

列表过滤

1用watch实现:

解决问题关键:过滤条件为空''时候返回的是整个数组

所以用watch完整形式实现,加了immediate能在一开始输入为空时候就执行一次handler

用indexOf表示返回数组里是否包含某个值

const vm = new Vue({el: '#root',data: {keyWord: '',persons: [{ id: '001', name: '马冬梅', age: 18 },{ id: '002', name: '周冬雨', age: 19 },{ id: '003', name: '周杰伦', age: 18 }], filpersons: []},watch: {keyWord: {immediate: true,//不等输入已经调用一次handlerhandler(val) {this.filpersons = this.persons.filter((p) => {// p是每个人的对象return p.name.indexOf(val) !== -1//判断是否包含用indexof,只要不等于-1//filter会返回一个全新数组,persons变了重新解析模板})}// 非常关键点:在一个数组上indexof一个''空字符串出来的是0}}})

新建一个filpersons存过滤后的数组,由于filter函数是通过返回新的数组但对原数组没有修改的方式进行过滤的

indexof意思是找数组里是否包含val并返回index值,只要不是-1就意味着有

2 computed实现(能用computed实现尽量用从他)

出现问题:watch实现能获得用户输入的新旧值,computed可以通过this.keyword来获得

#region 和#endregion在vscode里能让一段代码隐藏

const vm = new Vue({el: '#root',data: {keyWord: '',persons: [{ id: '001', name: '马冬梅', age: 18 },{ id: '002', name: '周冬雨', age: 19 },{ id: '003', name: '周杰伦', age: 18 }]},computed: {filpersons() {return this.persons.filter((p) => {return p.name.indexOf(this.keyWord) !== -1//判断是否包含用indexof,只要不等于-1//                         //filter会返回一个全新数组,persons变了重新解析模板})// 注意只有监控时候能收到新旧值,新数组值作为filperson的值,直接return// 第一个return是计算属性规定的,第二个return是filter规定的,只有返回值才知道filperson是什么}}})

列表排序

注意,对于数组排序:

arr=[1,2,4,3,5,3]
arr.sort((a,b)=>{
return a-b
}
)

这里a和b是获得的前后两个项,现在a-b是升序

 <input type="text" placeholder="input please" v-model="KeyWord"><button @click="sortType=2">increase sort</button><button @click="sortType=1">decrease sort</button><button @click="sortType=0">origin</button>
new Vue({el: '#root',data: {keyWord: '',sortType: 0,persons: [{ id: '001', name: '马冬梅', age: 18 },{ id: '002', name: '周冬雨', age: 19 },{ id: '003', name: '周杰伦', age: 18 }]},computed: {filpersons() {const arr =  this.persons.filter((p) => {return p.name.indexOf(this.keyWord) !== -1//判断是否包含用indexof,只要不等于-1//                         //filter会返回一个全新数组,persons变了重新解析模板})// 注意只有监控时候能收到新旧值,新数组值作为filperson的值,直接return// 第一个return是计算属性规定的,第二个return是filter规定的,只有返回值才知道filperson是什么// 先过滤再排序if(this.sortType){arr.sort((a,b)=>{return this.sortType===1?p2.age-p1.age: p1.age - p2.age// sort排序能收到前后两个数据项})}return arr}}})</script>

加了两个按钮,data里一个sorttype进行判断,注意computed要返回值

vue里的监控功能

Object.defineProperty(data,'name',{get(){return data.name读溢出,改uncaught原因:你想获取值调用get,调用get后又return data.name意味着又要调用get进入死循环,set也是同理},set(val){}
const obs=new Observer(data)创建一个监视的实例对象,监视data中属性变化function observer(obj){
const keys=object.keys()}

可以用observer进行模拟

通过setter实现监视,要在new vue时候就传入要检测的数据
对象后追加属性,vue默认不响应式处理
why:_data收集data中数据前先加工,给每个数据匹配一个getter和setter

vue.set只能给data某个对象增加属性,不能对vm或者vm根数据对象增加属性
如果要响应式处理:

vue.set(target,propertyname/index,value)
vm.$set(target,propertyname/index,value)
<h2>{{whatt}}</h2>
<div @click="addwhat">123</div>
methods:{addwhat(){Vue.set(this.whatt,'name','guess')}
}

vue检测数组中数据
vue修改数组中某个元素实现响应式一定用如下方法:
api:(1)push(),pop(),shift(),unshift(),splice(),sort(),reverse()
(2)vue.set()/vm.$set也能实现响应式第二个参数写索引,第三个写元素

总结:
1 单独改每个属性,因为vue能检测到对象里每个属性
2 将数组中元素单独替换,数据修改成功但vue不能检测到,因为数组元素没有getter和setter,修改数组中元素无法实现响应式
3 更改数组实现响应式,应该调用数组api或者vue.set

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

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

相关文章

mysql第五次作业

一、 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, …

node.js(expree.js )模拟手机验证码功能及登录功能

dbconfig.js const mysql require(mysql) module.exports {// 数据库配置config: {host: localhost, // 连接地址port: 3306, //端口号user: root, //用户名password: wei630229, //密码database: exapp2, //数据库名}, // 连接数据库&#xff0c;使用mysql的连接池连接方式…

MetaGPT-打卡-day2,MetaGPT框架组件学习

文章目录 Agent组件实现一个单动作的Agent实现一个多动作的Agent技术文档生成助手其他尝试 今天是第二天的打卡~昨天是关于一些概念的大杂烩&#xff0c;今天的话&#xff0c;就来到了Hello World环节。 从单个Agnet到多个Agent&#xff0c;再到组合更复杂的工作流来解决问题。…

【MCAL】SPI模块详解

目录 前言 正文 1. SPI通信协议介绍 2. AUTOSAR架构下的SPI模块 2.1 SPI模块介绍 2.2 关键概念理解 2.3 SPI模块详细设计 2.3.1 SPI可扩展功能 2.3.2 SPI Channel Job Sequence 2.2.3 通道缓存功能 2.2.4 同步和异步调用 2.4 SPI模块重要数据类型 2.4.1 Spi_Confi…

flink学习之水位线

什么是水位线 在事件时间语义下&#xff0c;我们不依赖系统时间&#xff0c;而是基于数据自带的时间戳去定义了一个时钟&#xff0c; 用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟&#xff0c;它的前进是靠数 据的时间戳来驱动的。 我们可以把时钟也以…

matlab多元线性回归

1.matlab多元回归示例如下&#xff1a; 解决问题&#xff1a;油价预测 方法&#xff1a;多元线性回归 实现&#xff1a;matlab regress()函数 技巧&#xff1a;通过增加X1^2&#xff0c;X2^2&#xff0c;或者X1*X2等构造的特征项&#xff0c;可以提高回归模型的拟合准确度&…

基于SpringBoot Vue自习室管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Mybatis面试题(四)

MyBatis 面试题 26、Mapper 编写有哪几种方式&#xff1f; 第一种&#xff1a;接口实现类继承 SqlSessionDaoSupport&#xff1a;使用此种方法需要编写mapper 接口&#xff0c;mapper 接口实现类、mapper.xml 文件。 1、在 sqlMapConfig.xml 中配置 mapper.xml 的位置 <m…

Bit.Store 加密卡集成主流 BRC20 ,助力 BTC 生态 Token 的流动性与消费

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中&#xff0c;通过以其推出的加密银行卡为媒介&#xff0c;助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初&#xff0c;就是以一种去中心化、点对点的现金系统为定…

R2DBC-响应式数据库

简单查询 基于全异步,响应式,消息驱动 用法: 1.导入驱动:导入连接池(r2dbc-pool),导入驱动(r2dbc-mysql) 2. 使用驱动提供的api操作 pom.xml <properties><r2dbc-mysql.version>1.0.5</r2dbc-mysql.version> </properties><dependencies><d…

黑马 Javaweb - MySQL 精华篇

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日&#xff0c;市场监管总局&#xff08;国家标准委&#xff09;批准发布一批重要国家标准&#xff0c;涉及生产生活、绿色可持续等多个领域&#xff0c;这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

02-编程猜谜游戏

本章通过演示如何在实际程序中使用 Rust&#xff0c;你将了解 let 、 match 、方法、关联函数、外部crate等基础知识。 本章将实现一个经典的初学者编程问题&#xff1a;猜谜游戏。 工作原理如下&#xff1a;程序将随机生成一个介于 1 和 100 之间的整数。然后&#xff0c;程序…

C# Cad2016二次开发选择csv导入信息(七)

//选择csv导入信息 [CommandMethod("setdata")] //本程序在AutoCAD的快捷命令是"DLLLOAD" public void setdata() {Microsoft.Win32.OpenFileDialog dlg new Microsoft.Win32.OpenFileDialog();dlg.DefaultExt ".csv";// Display OpenFileDial…

DNS寻址过程

用一张图详细的描述DNS寻址的过程&#xff0c;是高级前端进阶的网络篇&#xff1a; 主要是第三步要记仔细就行啦&#xff0c;每一步都要详细的记录下来&#xff0c;总结的脉络如下&#xff1a; 本地DNS缓存本地DNS服务器根域名服务器 顶级域名服务器再次顶级域名服务器权威域名…

YOLOv5改进 | 主干篇 | 华为移动端模型GhostnetV2一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv2,华为GhostNetV2是为移动应用设计的轻量级卷积神经网络(CNN),旨在提供更快的推理速度,其引入了一种硬件友好的注意力机制,称为DFC注意力。这个注意力机制是基于全连接层构建的,它的设计目的是在通用硬…

Vue-21、Vue监测数组改变

1、数组调用以下方法Vue可以监测到。 arr.push(); 向数组的末尾追加元素 const array [1,2,3] const result array.push(4) // array [1,2,3,4] // result 4arr.pop(); 删除末尾的元素 const array [a, b] array.pop() // b array.pop() // a array.pop() // undefi…

Elasticsearch各种高级文档操作3

本文来记录几种Elasticsearch的文档操作 文章目录 初始化文档数据聚合查询文档概述对某个字段取最大值 max 示例对某个字段取最小值 min 示例对某个字段求和 sum 示例对某个字段取平均值 avg 示例对某个字段的值进行去重之后再取总数 示例 本文小结 初始化文档数据 在进行各种文…

flutter获取地理定位:geolocator依赖详细用法

本文使用geolocator插件实现app物理定位功能。 该插件的主要功能有&#xff1a; 获取最后已知位置&#xff1b;获取设备当前位置&#xff1b;获取连续的位置更新&#xff1b;检查设备是否启用了定位服务&#xff1b;计算两个地理坐标之间的距离&#xff08;米&#xff09;&am…

AI时代—ChatGPT-4.5的正确打开方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…