Vue的遍历(列表、对象、字符串、数字)、key的原理

news2024/9/20 13:17:31

目录

  • 1 遍历(列表、对象、字符串、数字)
  • 2. key的原理
    • 2.1 key使用index
    • 2.1 key使用数据的唯一id
    • 2.3 key的原理
  • 3. 列表过滤
  • 4. 列表排序

1 遍历(列表、对象、字符串、数字)

key可以使用数据的唯一字段(最好),也可以使用index(默认)

使用示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <h2>人员列表(遍历数组)</h2>
    <ul>
        <li v-for="(p,index) in persons" :key="p.id">
            {{p.name}}-{{p.age}}
        </li>
    </ul>

    <h2>汽车信息(遍历对象)</h2>
    <ul>
        <li v-for="(value,k) of car" :key="k">
            {{k}}-{{value}}
        </li>
    </ul>

    <h2>遍历字符串</h2>
    <ul>
        <li v-for="(char,index) of str" :key="index">
            {{char}}-{{index}}
        </li>
    </ul>

    <h2>遍历指定次数</h2>
    <ul>
        <li v-for="(number,index) of 3" :key="index">
            {{index}}-{{number}}
        </li>
    </ul>
</div>

<script type="text/javascript">

    new Vue({
        el: '#root',
        data: {
            persons: [
                {id: '001', name: '张三', age: 18},
                {id: '002', name: '李四', age: 19},
                {id: '003', name: '王五', age: 20}
            ],
            car: {
                name: '苹果',
                price: '6元',
                color: '红色'
            },
            str: 'hello'
        }
    })
</script>

</body>
</html>

显示效果
遍历效果

2. key的原理

2.1 key使用index

我们先看如下的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <h2>人员列表(遍历数组)</h2>
    <button @click.once="add">添加一个老刘</button>
    <ul>
        <li v-for="(p,index) of persons" :key="index">
            {{p.name}}-{{p.age}}
            <input type="text">
        </li>
    </ul>
</div>

<script type="text/javascript">

    new Vue({
        el: '#root',
        data: {
            persons: [
                {id: '001', name: '张三', age: 18},
                {id: '002', name: '李四', age: 19},
                {id: '003', name: '王五', age: 20}
            ]
        },
        methods: {
            add() {
                const p = {id: '004', name: '老刘', age: 40}
                this.persons.unshift(p)
            }
        }
    })
</script>

</body>
</html>

输入框输入内容如下:
人员列表

再点击添加一个老刘。结果如下

添加老刘

内部发生的过程如下:

index作为key

2.1 key使用数据的唯一id

这里代码还是和上面的一样,只是修改为:key="p.id"

输入框输入内容如下:
人员列表

再点击添加一个老刘。结果如下
添加老刘

内部发生的过程如下:
id作为key

2.3 key的原理

key的内部原理)

  • 虚拟DOM中key的作用:

    • key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】
    • 随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
  • 对比规则:

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

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

      • 创建新的真实DOM,随后渲染到到页面
  • 用index作为key可能会引发的问题:

    • 若对数据进行:逆序添加、逆序删除等破坏顺序操作: 会产生没有必要的真实DOM更新,界面效果没问题, 但效率低
    • 如果结构中还包含输入类的DOM:会产生错误DOM更新,界面有问题
  • 开发中如何选择key?:

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

3. 列表过滤

使用计算属性和监测属性实现列表过滤,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<div id="root">
    <h2>人员列表</h2>
    <input type="text" placeholder="请输入名字" v-model="keyWord">
    <ul>
        <li v-for="(p,index) of filPerons" :key="p.id">
            {{p.name}}-{{p.age}}-{{p.sex}}
        </li>
    </ul>
</div>

<script type="text/javascript">

    //用watch实现
    /* new Vue({
        el: '#root',
        data: {
            keyWord: '',
            persons: [
                {id: '001', name: '马冬梅', age: 19, sex: '女'},
                {id: '002', name: '周冬雨', age: 20, sex: '女'},
                {id: '003', name: '周杰伦', age: 21, sex: '男'},
                {id: '004', name: '温兆伦', age: 22, sex: '男'}
            ],
            filPerons: []
        },
        watch: {
            keyWord: {
                immediate: true,
                handler(val) {
                    this.filPerons = this.persons.filter((p) => {
                        return p.name.indexOf(val) !== -1
                    })
                }
            }
        }
    }) */

    //用computed实现
    new Vue({
        el: '#root',
        data: {
            keyWord: '',
            persons: [
                {id: '001', name: '马冬梅', age: 19, sex: '女'},
                {id: '002', name: '周冬雨', age: 20, sex: '女'},
                {id: '003', name: '周杰伦', age: 21, sex: '男'},
                {id: '004', name: '温兆伦', age: 22, sex: '男'}
            ]
        },
        computed: {
            filPerons() {
                return this.persons.filter((p) => {
                    return p.name.indexOf(this.keyWord) !== -1
                })
            }
        }
    })
</script>

</body>
</html>

显示效果
列表过滤

4. 列表排序

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javaScript" src="../js/vue.js"></script>
</head>
<body>

<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) of filPerons" :key="p.id">
            {{p.name}}-{{p.age}}-{{p.sex}}
        </li>
    </ul>
</div>

<script type="text/javascript">

    new Vue({
        el: '#root',
        data: {
            keyWord: '',
            sortType: 0, // 0原顺序 1降序 2升序
            persons: [
                {id: '001', name: '马冬梅', age: 30, sex: '女'},
                {id: '002', name: '周冬雨', age: 31, sex: '女'},
                {id: '003', name: '周杰伦', age: 18, sex: '男'},
                {id: '004', name: '温兆伦', age: 19, sex: '男'}
            ]
        },
        computed: {
            filPerons() {
                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>

</body>
</html>

效果如下:
列表排序

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

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

相关文章

数据科学已死?

既然有了人工智能&#xff0c;训练自己的机器学习模型是否还值得&#xff1f; 既然有了人工智能&#xff0c;学习 Python 是否还值得&#xff1f; 既然有了人工智能&#xff0c;KNIME 还在营业吗&#xff1f; 既然有了人工智能&#xff0c;数据科学是否仍然需要&#xff1f;…

【深度学习与NLP】——Transformer架构解析

目录 第一章:Transformer背景介绍 1.1 Transformer的诞生 1.2 Transformer的优势 1.3 Transformer的市场 第二章:Transformer架构解析 2.1 认识Transformer架构 2.1.1 Transformer模型的作用 2.1.2 Transformer总体架构图 2.2 输入部分实现 2.2.1 文本嵌入层的作用 …

维护和升级LabVIEW程序

在维护和升级LabVIEW程序时&#xff0c;需要全面考虑代码的现状和未来的需求。以下是各个方面的详细注意事项&#xff0c;以确保程序能够在稳定性和性能方面得到提升。 1. 理解现有代码: 深入代码分析: 仔细阅读现有的代码&#xff0c;了解其逻辑结构、数据流、和控制流程。关注…

众善慈善机构:帮助贫困地区的人们提高自身的就业能力和创业能力

众善慈善机构是一家致力于帮扶和脱贫的慈善机构&#xff0c;主要致力于帮助贫困地区的人们改善生活条件&#xff0c;提高生活质量。 众善慈善机构的主要帮扶对象是贫困地区的儿童、老人和残疾人。他们通过开展各种救助项目&#xff0c;为这些人群提供生活物资、教育、医疗等方面…

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …

GDB的基本使用

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

哈啰出行Java开发工程师一面面经(校招)

牛客网最新面经分享面试过程&#xff1a; 小编为参加校招、秋招、金九银十面试季的小伙伴们准备了一份很全很详细的java面试宝典&#xff08;包含各个大厂真题以及最常见的八股文含答案&#xff09;&#xff0c;由于平台篇幅原因&#xff0c;就不在这里一一展示了&#xff0c;…

企业高性能web服务器之nginx篇

文章目录 Nginx核心配置location 使用详情location之精确匹配location之区分大小写location之不区分大小写location之文件名后缀 Nginx账户认证功能自定义错误页面自定义错误日志检测文件是否存在长连接下载服务器 Nginx高级配置Nginx的状态页Nginx 压缩功能Nginx 变量使用Ngin…

5G+智慧农业大数据解决方案

1. 5G智慧农业大数据概述 5G智慧农业大数据方案融合5G网络、大数据等技术&#xff0c;推动农业向智能化、信息化发展。方案包含农产品质量追溯、农业物联网、电子商务、休闲农业等多个平台&#xff0c;全面支撑乡村振兴战略。 2. 乡村振兴战略的政策背景 2022年中央一号文件…

什么是黄金期权?黄金期权合约详解

想要了解什么是黄金期权首先要了解一下黄金期货。黄金期货是以现货黄金为标的物的期货品种&#xff0c;其交易代码通常为Au。而黄金期权&#xff0c;又称为黄金期货期权&#xff0c;是一种期权合约&#xff0c;其标的物是黄金期货合约本身&#xff0c;而非黄金现货。这意味着期…

词向量(One-Hot Encoding、Word Embedding、Word2Vec)

词向量&#xff0c;顾名思义&#xff0c;用向量表示单词。 1、One-Hot Encoding One-Hot编码&#xff0c;又称为一位有效编码&#xff0c;主要是采用N位状态寄存器来对N个状态进行编码&#xff0c;每个状态都由他独立的寄存器位&#xff0c;并且在任意时候只有一位有效。 One…

回归预测|基于雪消融优化相关向量机的数据回归预测Matlab程序SAO-RVM 多特征输入单输出 SAO-RVM

回归预测|基于雪消融优化相关向量机的数据回归预测Matlab程序SAO-RVM 多特征输入单输出 SAO-RVM 文章目录 前言回归预测|基于雪消融优化相关向量机的数据回归预测Matlab程序SAO-RVM 多特征输入单输出 SAO-RVM 一、SAO-RVM模型1. 基本模型原理2. 贝叶斯框架3. 模型优化流程4. 总…

AI 智能体:从普通人到《黑神话:悟空》,保姆级教程让你瞬间变身!

大家好&#xff0c;我是木川 今天还没下班&#xff0c;就看到一款名为《黑神话:悟空》的游戏火爆全网&#xff0c;唤醒了无数玩家对大圣孙悟空的崇拜与向往。游戏中&#xff0c;悟空的七十二变让人叹为观止&#xff0c;但你是否想过&#xff0c;借助AI的力量&#xff0c;我们也…

Kimi + 小爱音箱,我家宝贝的新聊天伙伴。

给儿子制作了一个特别版的小爱音箱&#xff0c;它集成了 Kimi 大模型&#xff0c;他对这个聪明的音箱简直着迷到不行&#xff0c;整天跟它聊天&#xff0c;问东问西。 希望这个玩具不仅能激发起他对 AI 的浓厚兴趣&#xff0c;最好还能让他对我这个老爸有那么一点点的崇拜&…

函数进阶—python

一、函数如何返回多个返回值 如果想让一个函数有多个返回值&#xff0c;该怎么办&#xff1f; 返回多个数据&#xff0c;按照返回值的顺序&#xff0c;用对应顺序的多个变量接收即可&#xff0c;变量之间用逗号隔开&#xff0c;支持不同类型的数据return&#xff0c;如下列代…

GATK SampleList接口介绍

在 GATK 中&#xff0c;SampleList 是一个接口&#xff0c;用于表示一个样本列表。这些样本通常是在基因组分析过程中被处理的不同生物样本。SampleList 接口提供了访问这些样本的一些基本方法&#xff0c;通常用于多样本分析任务&#xff0c;比如变异检测或基因组重测序。 Sa…

入门request请求库使用

基础条件 想要入门request 打开pycharm的终端查看是否在虚拟环境下 在路径前面是否有&#xff08;venv&#xff09; 如果没有需要先配置虚拟环境 然后在终端中输入 pip install request 等待下载完成后就在我们的项目中导入 基本用法 1.发送GET请求 import requestsurl…

【C#】去掉字符串中的第一或最后一位

要去掉字符串中的第一或最后一位&#xff0c;可以使用以下几种方法&#xff1a; 1. 去掉第一位 如果想去除字符串的第一位&#xff0c;同样可以使用 Substring 方法。 1.1 使用 Substring 方法 string str "8,"; if (str.Length > 0) {str str.Substring(1)…

如何利用AI创作高质量的文章

讯飞星火 利用AI创作高质量的文章需要遵循以下步骤&#xff1a; 确定主题和目标受众&#xff1a;在开始写作之前&#xff0c;明确文章的主题和目标受众。这将帮助你确定文章的风格、结构和内容。 收集资料和信息&#xff1a;在撰写文章之前&#xff0c;进行充分的研究&#x…

推荐一款基于Spring Boot + VUE 框架开发的分布式文件管理系统,功能齐全、实用便捷(附源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解-决…