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

news2024/11/19 15:37:04

目录

  • 一、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.coloradmin.cn/o/851930.html

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

相关文章

webshell链接工具-Godzilla(哥斯拉)

项目地址 https://github.com/BeichenDream/Godzilla

“构建高级自定义MVC框架实现CRUD功能的完整指南“

目录 前言1. 导入罐2. 导入工具类3. 配置框架配置文件以及web.xml4. 创建实体类、DAO、Service和Controller5. 配置框架的配置文件6. 页面前端开发 总结 前言 在现代的Web开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式被广泛应用。它将应用程序…

C++中如何让程序休眠自定义的时长

在C中&#xff0c;可以使用以下几种方法让程序休眠指定的时间&#xff1a; 1 使用操作系统相关的方法&#xff0c;如 Windows 中的 Sleep 函数&#xff0c;需要包含 <windows.h> 头文件 #include <windows.h> // 休眠1000毫秒&#xff08;1秒&#xff09; Sleep(…

Spring自定义参数解析器设计

1.什么是参数解析器 RequstBody、RequstParam 这些注解是不是很熟悉&#xff1f; 我们在开发Controller接口时经常会用到此类参数注解&#xff0c;那这些注解的作用是什么&#xff1f;我们真的了解吗&#xff1f; 简单来说&#xff0c;这些注解就是帮我们将前端传递的参数直…

怎么把图片表格转换成word表格?几个步骤达成

在处理文档时&#xff0c;图片表格的转换是一个常见的需求。而手动输入表格是非常耗时的&#xff0c;因此&#xff0c;使用文本识别软件来自动转换图片表格可以大大提高工作效率。在本文中&#xff0c;我们将介绍如何使用OCR文字识别技术来将图片表格转换为Word表格。 OCR文字识…

Redis基础命令大全

这里写目录标题 第一章、Redis 命令大全1.1&#xff09;通用命令语法&#xff1a;ping语法&#xff1a;dbsize语法&#xff1a;select db语法&#xff1a;flushdb语法&#xff1a;exit 或 quit语法&#xff1a;redis-cli 1.2&#xff09;Redis 的 Key 的操作命令语法&#xff1…

20、Flink SQL之SQL Client: 不用编写代码就可以尝试 Flink SQL,可以直接提交 SQL 任务到集群上

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

echarts图表中Y(y)轴间距固定,等间距,刻度固定,设置最大值、最小值

echarts图表中Y(y)轴间距固定&#xff0c;等间距&#xff0c;刻度固定&#xff0c;设置最大值、最小值 正确的写法interval: 2.5指定刻度间隔,我的间距2.5 、5、7.5、10、12.5,所以需要改成这种。如果你是 yAxis: {name: 退款率%,type: value,min: 2.5,max: 12.5,interval: …

【基础类】—安全类

一、CSRF 基础概念和缩写 CSRF&#xff0c; 通常称为跨站请求伪造&#xff0c;英文名 Cross-site request forgery 缩写 CSRF攻击原理 关键点&#xff1a; 利用你本身的漏洞自动去执行接口&#xff0c;同时要依赖于用户要登录网站(比如微博粉丝关注) 2-1 网站A中某个接口存在…

CAD怎么转高清JPG图片?三种方法轻松搞定

将CAD文件转换为JPG图像格式可以让文件更易于共享&#xff0c;并且可以更轻松地在不同平台上传递。此外&#xff0c;JPG文件格式具有更小的文件大小&#xff0c;可以更快速地下载或上传。但是&#xff0c;需要注意的是&#xff0c;转换为JPG格式可能会导致图像质量下降&#xf…

分布式问题

1. 分布式系统CAP原理 CAP原理&#xff1a;指在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;、Partitontolerance&#xff08;分区容忍性&#xff09;&#xff0c;三者不可得兼。 一致性&#xff08;C…

【数据分析专栏之Python篇】五、pandas数据结构之Series

前言 大家好&#xff01;本期跟大家分享的知识是 Pandas 数据结构—Series。 一、Series的创建 Series 是一种类似于一维数组的对象&#xff0c;由下面两部分组成&#xff1a; values&#xff1a;一组数据&#xff0c;ndarray 类型index&#xff1a;数据索引 顾名思义&…

华为智选首款纯电轿跑“LUXEED”能大卖吗?

监制 | 何玺 排版 | 叶媛 华为智选纯电轿跑来袭&#xff01; 8月7日&#xff0c;华为常务董事余承东在社交媒体上发文&#xff0c;宣布华为智选即将推出首款“突破想象”的纯电轿跑车。 01 华为智选首款纯电轿跑来袭 余承东的发文引起了极大关注&#xff0c;在各大媒体的报…

2024考研408-计算机网络 第六章-应用层学习笔记

文章目录 前言一、网络应用模型1.1、认识应用层功能和特点1.2、网络应用层模型&#xff1a;1.2.1、客户/服务器&#xff08;C/S&#xff09;模型1.2.2、P2P模型 二、DNS系统2.1、认识DNS与IP地址的关系2.2、DNS解析的大致流程2.3、域名的分类2.4、域名服务器的分类2.5、域名解析…

linux (platform driver)平台设备驱动匹配方法

Table of Contents 一、匹配函数platform_match 1.1、设备树匹配方法 1.2、id_table匹配方法 1.3、dev-name和platform_driver->drv->name匹配方法 一、匹配函数platform_match 平台设备驱动分为设备层和驱动层&#xff0c;每当有新的设备或者新的设备驱动注册时都要…

webshell链接工具-antSword(中国蚁剑)

中国蚁剑是一款开源的跨平台网站管理工具&#xff0c;它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。 任何人不得将其用于非法用途以及盈利等目的&#xff0c;否则后果自行承担并将追究其相关责任&#xff01; 项目地址&#xff1a; https://github.c…

GitOps 与 DevOps:了解关键差异,为企业做出最佳选择

在软件开发领域&#xff0c;GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术。虽然这两种模式都旨在提高软件开发生命周期的效率&#xff0c;但它们的核心原则和实施方式却各不相同。 本篇文章将帮助您了解 GitOps 和 DevOps 之间的差异、它们的工作流程&am…

IBM Spectrum LSF 负载共享工具基本介绍和使用

IBM Spectrum LSF 负载共享工具基本介绍和使用 LSF&#xff08;Load Sharing Facility&#xff09;是IBM旗下的一款分布式集群管理系统软件&#xff0c;负责计算资源的管理和批处理作业的调度。它给用户提供统一的集群资源访问接口&#xff0c;让用户透明地访问整个集群资源。…

Python-OpenCV中的图像处理-颜色空间转换

Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种&#xff1a; BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意&#xff1a;在 OpenCV 的…

linux基于信号量实现多线程生产者消费者模型

基于信号量实现多线程生产者消费者模型。 编程思路&#xff1a; 1.食物的初始化编号为100&#xff1a; beginnum 100&#xff1b; 2.仓库有5个空碗&#xff0c;最多保存5个食物&#xff1a;queue[5]&#xff1b; 3.初始化空碗的数量为5&#xff0c;食物的数量为0&#xff1a…