第8集丨Vue 江湖 —— 列表渲染

目录

  • 一、v-for指令
    • 1.1 遍历数组
    • 1.2 遍历对象
    • 1.3 遍历字符串
    • 1.4 遍历指定次数
    • 1.5 案例整合
  • 二、key的作用与原理
    • 2.1 虚拟DOM中key的作用
    • 2.2 新旧虚拟DOM对比规则
    • 2.3 用index作为key可能会引发的问题
      • 2.3.1 错误案例
      • 2.3.2 错误效果
      • 2.3.3 错乱原理图
    • 2.4 开发中如何选择key?
  • 三、列表过滤
    • 3.1 watch实现
    • 3.2 computed计算属性实现
  • 四、列表排序
    • 4.1 需求
    • 4.2 实现

一、v-for指令

  1. 用于展示列表数据
  2. 语法v-for="(item, index) in/of xxx" :key="yyy"
  3. 可遍历:数组、对象、字符串、指定次数。

1.1 遍历数组

下面案例中,定义了一个数组persons , 我们使用v-for指令进行遍历,遍历的次数即为数组的长度length

接受的参数有两个,一个是数组中的每一项p,另一个参数为数组的索引值index,并用:key动态指定每一项的唯一标识key

注意:这里的唯一标识key不会在真实DOM上,但是会在Vue生成的虚拟DOM上。在用DIFF算法的时候会用到。

具体代码如下所示:

<div id="root"><ul><li v-for="(p,index) in persons" :key="index">{{p.name}} - {{p.use}}</li></ul>
</div>
<script>new Vue({el:'#root',data:{persons:[{id:'001',name:'令狐冲',use:"独孤九剑"},{id:'002',name:'任盈盈',use:"仙女下凡"},{id:'003',name:'任我行',use:"吸星大法"}]}})
</script>

1.2 遍历对象

下面案例中,定义了一个对象person , 我们使用v-for指令进行遍历,遍历的次数即为对象的属性的个数。

接受的参数有两个,一个是对象中的每个属性的值value,另一个参数为对象的属性名key,并用:key动态指定每一项的唯一标识key

<div id="root"><ul><li v-for="(value,key) of person" :key="key">{{key}} - {{value}}</li></ul>
</div>
<script>new Vue({el:'#root',data:{person:{name:'令狐冲',use:'独孤九剑',menpai:'华山派'}}})
</script>

1.3 遍历字符串

下面案例中,定义了一个字符串str , 我们使用v-for指令进行遍历,遍历的次数即为字符串的字符个数。

接受的参数有两个,一个是字符串中的每个字符值char,另一个参数为字符串的索引index,并用:key动态指定每一项的唯一标识key

<div id="root"><ul><li v-for="(char,index) of str" :key="index">{{index}} - {{char}}</li></ul>
</div>
<script>new Vue({el:'#root',data:{str:'笑傲江湖'}})
</script>

1.4 遍历指定次数

下面案例中,指定遍历次数为5次,我们使用v-for指令进行遍历。

接受的参数有两个,一个是数值number,另一个参数为索引index,并用:key动态指定每一项的唯一标识key

<div id="root"><ul><li v-for="(number,index) of 5" :key="index">{{index}} - {{number}}</li></ul>
</div>

1.5 案例整合

<div id="root"><h2>遍历数组</h2><ul><li v-for="(p,index) in persons" :key="index">{{p.name}} - {{p.use}}</li></ul><h2>遍历对象</h2><ul><li v-for="(value,key) of person" :key="key">{{key}} - {{value}}</li></ul><h2>遍历字符串:'笑傲江湖'</h2><ul><li v-for="(char,index) of str" :key="index">{{index}} - {{char}}</li></ul><h2>遍历指定次数:5次</h2><ul><li v-for="(number,index) of 5" :key="index">{{index}} - {{number}}</li></ul>
</div>
<script>new Vue({el:'#root',data:{persons:[{id:'001',name:'令狐冲',use:"独孤九剑"},{id:'002',name:'任盈盈',use:"仙女下凡"},{id:'003',name:'任我行',use:"吸星大法"}],person:{name:'令狐冲',use:'独孤九剑',menpai:'华山派'},str:'笑傲江湖'}})
</script>

二、key的作用与原理

2.1 虚拟DOM中key的作用

  • key是虚拟DOM对象的唯一标识
  • 当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM
  • 随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异进行比较。

2.2 新旧虚拟DOM对比规则

  • 旧虚拟DOM中找到了与新虚拟DOM相同的key:

     ⅰ. 若【虚拟DOM】中内容没变,直接使用之前的【真实DOM】 !ⅱ. 若【虚拟DOM】中内容变了,则生成【新的真实DOM】,随后替换掉页面中【之前的真实DOM】.
    
  • 旧虚拟DOM中未找到与新虚拟DOM相同的key

      ⅰ. 创建【新的真实DOM】,随后渲染到到页面。
    

2.3 用index作为key可能会引发的问题

  • 若对数据进行:逆序添加逆序删除破坏顺序操作:

    ⅰ. 会产生没有必要的【真实DOM】更新==>界面效果没问题,但效率低。
    
  • 如果结构中还包含输入类的DOM:

      i . 会产生【错误DOM】更新==>界面有问题。
    

2.3.1 错误案例

<div id="root"><h2>index作为key引发的问题</h2><button @click.once="add">在列表最前面:添加一个小六六</button><ul><li v-for="(p,index) in persons" :key="index">{{p.name}} - {{p.use}}<input type="text" ></li></ul>
</div>
<script>new Vue({el:'#root',data:{persons:[{id:'001',name:'令狐冲',use:"独孤九剑"},{id:'002',name:'任盈盈',use:"仙女下凡"},{id:'003',name:'任我行',use:"吸星大法"}]},methods: {add() {this.persons.unshift({id:'004',name:'老六',use:'不会武功'})}},})
</script>

2.3.2 错误效果

  1. 在浏览器中打开案例,之后在输入框中输入一些内容

在这里插入图片描述

  1. 点击添加按钮,此时会发现输入框已经错乱了。

在这里插入图片描述

2.3.3 错乱原理图

  1. 遍历列表index作为key时,发生错乱原理图,如下所示:

在这里插入图片描述

  1. 遍历列表id作为key时,为什么没有发生错乱原理图,如下所示:

在这里插入图片描述

2.4 开发中如何选择key?

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

三、列表过滤

需求:做一个列表过滤功能,UI如下图所示。在输入框中输入内容实现下面列表的过滤显示。

在这里插入图片描述

3.1 watch实现

  • 列表显示:使用 v-for指令遍历数组persons
  • data中定义属性filPersons:存放过滤后的内容
  • 使用数组filter方法实现过滤
<div id="root"><h2>列表过滤</h2><input type="text" placeholder="请输入内容" v-model="keyWord"><ul><li v-for="(p,index) in filPersons" :key="index" >{{p.name}} - {{p.use}} - {{p.sex}}</li></ul></div>
<script>new Vue({el:'#root',data:{keyWord:'',persons:[{id:'001',name:'令狐冲',use:"独孤九剑",sex:'男'},{id:'002',name:'任盈盈',use:"仙女下凡",sex:'女'},{id:'003',name:'任我行',use:"吸星大法",sex:'男'}],filPersons:[]},watch:{keyWord:{immediate:true,handler(value){this.filPersons = this.persons.filter((p)=>{return p.name.indexOf(value)>=0})}}}})
</script>

3.2 computed计算属性实现

  • 列表显示:使用 v-for指令遍历数组persons
  • 定义计算属性filPersons:存放过滤后的内容
  • 使用数组filter方法实现过滤
<div id="root"><h2>列表过滤</h2><input type="text" placeholder="请输入内容" v-model="keyWord"><ul><li v-for="(p,index) in filPersons" :key="index" >{{p.name}} - {{p.use}} - {{p.sex}}</li></ul></div>
<script>new Vue({el:'#root',data:{keyWord:'',persons:[{id:'001',name:'令狐冲',use:"独孤九剑",sex:'男'},{id:'002',name:'任盈盈',use:"仙女下凡",sex:'女'},{id:'003',name:'任我行',use:"吸星大法",sex:'男'}]},computed:{filPersons(){return this.persons.filter((p)=>{return p.name.indexOf(this.keyWord)!==-1})}}})
</script>

四、列表排序

4.1 需求

要求:在上述案例中,增加排序功能,分别为升序、降序功能

在这里插入图片描述

4.2 实现

  • 定义sortType属性:2升序、1降序、0原顺序
  • 数组sort方法:arr.sort(a,b)a-b为升序,b-a为降序
<div id="root"><h2>列表过滤</h2><input type="text" placeholder="请输入内容" v-model="keyWord"><button @click="sortType=2">年龄升序</button><button @click="sortType=1">年龄降序</button><button @click="sortType=0">原顺序</button><ul><li v-for="(p,index) in filPersons" :key="p.id" >{{p.name}} - {{p.use}} - {{p.age}}</li></ul></div>
<script>new Vue({el:'#root',data:{keyWord:'',sortType:0,persons:[{id:'001',name:'令狐冲',use:"独孤九剑",sex:'男',age:20},{id:'002',name:'任盈盈',use:"仙女下凡",sex:'女',age:19},{id:'003',name:'任我行',use:"吸星大法",sex:'男',age:50}]},computed:{filPersons(){const arr = this.persons.filter((p)=>{return p.name.indexOf(this.keyWord)!==-1})if(this.sortType) {arr.sort((p1,p2)=>{return this.sortType === 1 ? (p2.age - p1.age) : (p1.age - p2.age);})}return arr;}}})
</script>

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

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

相关文章

Windows下安装Sqoop

Windows下安装Sqoop 一、Sqoop简介二、Sqoop安装2.1、Sqoop官网下载2.2、Sqoop网盘下载2.3、Sqoop安装&#xff08;以version&#xff1a;1.4.7为例&#xff09;2.3.1、解压安装包到 D:\bigdata\sqoop\1.4.7 目录2.3.2、新增环境变量 SQOOP_HOME2.3.3、环境变量 Path 添加 %SQO…

【C++进阶】:异常

异常 一.异常的概念二.基本使用三.异常重新抛出四.异常规范五.异常安全六.异常的优缺点 一.异常的概念 c语言 传统的错误处理机制&#xff1a; 1. 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。…

Openlayers实战:使几何图形适配窗口

Openlayers开发的项目中,有一种应用非常重要,就是绘制或者显示出几何图形后,让几何图形居中并适配到窗口下,这样能让用户很好的聚焦到所要看的内容中去。 这里使用了fit的这个view 的方法,具体的操作请参考示例源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozh…

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用&#xff0c;与任何其他平台的部署相同&#xff0c;可以2种方式&#xff1a; 依赖于框…

Android 项目导入高德SDK初次上手

文章目录 一、前置知识&#xff1a;二、学习目标三、学习资料四、操作过程1、创建空项目2、高德 SDK 环境接入2.1 获取高德 key2.2下载 SDK 并导入2.2.1、下载SDK 文件2.2.2、SDK 导入项目2.2.3、清单文件配置2.2.4、隐私权限 3、显示地图 一、前置知识&#xff1a; 1、Java 基…

24届近5年东华大学自动化考研院校分析

今天给大家带来的是东华大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、东华大学 学校简介 东华大学&#xff08;Donghua University&#xff09;&#xff0c;地处上海市&#xff0c;是教育部直属全国重点大学&#xff0c;国家“双一流”、“211工程”建设高校…

亿欧智库:2023中国宠物行业新趋势洞察报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 户外赛道本质上迎合了全球共性需求的增长&#xff0c;从养宠意愿的转化到养宠生活的需求&#xff0c;多层次的需求推动行业发展新趋势 从需求端进行分析&#xff0c;可以将养宠意愿的转化分为三个层…

基于gpt4all的企业内部知识问答服务应用搭建

文章目录 痛点项目缘起技术选型fine-tuningfew shot prompt engineering选定方案的特征描述 模型赛马gpt4all调优部署时踩坑python3.9 header缺失 -- 安装下缺失的就行运行时参数调优 代码分析项目代码库代码 效果展示例子1例子2 附录&#xff1a;所用的公司内部API文档例子&am…

2、简单上手+el挂载点+v-xx(v-text、v-html、v-on、v-show、v-if、v-bind、v-for)

官网&#xff1a; vue3&#xff1a;https://cn.vuejs.org/ vue2&#xff1a;https://v2.cn.vuejs.org/v2/guide/ 简单上手&#xff1a; 流程&#xff1a; 导入开发版本的Vue.js <!--开发环境版本&#xff0c;包含了有帮助的命令行警告--> <script src"https…

Qt+C++实现灯带动画运动位置变换移动跑马灯图片轮播

程序示例精选 QtC实现灯带动画运动位置变换移动跑马灯图片轮播 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC实现灯带动画运动位置变换移动跑马灯图片轮播>>编写代码&…

JS二维数组转化为对象

将二维数组转化为对象的形式 转之前的数据&#xff1a; 转之后&#xff1a; const entries new Map([[foo, bar],[baz, 42],[beginNode, 202212151048010054],[beginNode, 202212151048447710],]); console.log(entries)const obj Object.fromEntries(entries);console.lo…

代码审计-RCE命令执行漏洞审计

代码审计必备知识点&#xff1a; 1、代码审计开始前准备&#xff1a; 环境搭建使用&#xff0c;工具插件安装使用&#xff0c;掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集&#xff1a; 审计目标的程序名&#xff0c;版本&#xff0c;当前环境(系统,中间件…