Vue的渲染原理

列表渲染

列表渲染

v-for指令写在循环项上:v-for=“(一个参数或者两个参数) in/of 要遍历的数组、对象、字符串、指定次数”

  • 遍历数组时参数分别是数组中元素(可以是一个对象)和元素所在下标(从0开始)
  • 遍历对象时参数分别是属性值和属性名
  • 遍历字符串时参数分别是单个字符和字符所在下标(从0开始)
  • 遍历次数时参数分别是当前遍历的次数和遍历次数所在的下标(从0开始)
<body><div id="app"><h1>{{msg}}</h1><h2>遍历数组</h2><!-- 静态列表 --><ul><li>张三</li><li>李四</li><li>王五</li></ul><!--动态列表--><ul><li v-for="name of names">{{name}}</li></ul><ul><li v-for="(name,index) of names"> {{name}}-{{index}}</li></ul><h2>遍历对象的属性</h2><ul><li v-for="(value, propertyName) of user">{{propertyName}},{{value}}</li></ul><h2>遍历字符串</h2><ul><li v-for="(c,index) of str">{{index}},{{c}}</li></ul><h2>遍历指定的次数</h2><ul><li v-for="(num,index) of counter">{{index}}, {{num}}</li></ul><!--遍历数组中的对象--><table><tr><th>序号</th><th>会员名</th><th>年龄</th><th>选择</th></tr><tr v-for="(vip,index) in vips"><td>{{index+1}}</td><td>{{vip.name}}</td><td>{{vip.age}}</td><td><input type="checkbox"></td></tr></table></div><script>const vm = new Vue({el : '#app',data : {msg : '列表渲染',names : ['jack','lucy','james'],vips : [{id:'111',name:'jack',age:20},{id:'222',name:'lucy',age:30},{id:'333',name:'james',age:40}],user : {id : '111',name : '张三',gender : '男'},str : '动力节点',counter : 10}})</script>

v-for的key的作用以及实现原理

Vue框架采用了虚拟Dom机制+diff算法来提高渲染效率, 只有真正改变的dom元素才会重新渲染

  • 虚拟dom就是在内存当中的dom对象
  • diff算法是一种能够快速的比较两个事物不同之处的算法

新的虚拟dom和旧的虚拟dom比较原则: 根据v-for指令所在的标签的key属性值(key存在于虚拟dom元素中是其的唯一标识)

  • 先拿key的属性值进行比较, 如果属性值相同则继续比较子元素(key属性是dom元素的唯一标识)
    • 子元素不同:直接将新的虚拟dom元素渲染到页面生成新的真实dom元素
    • 子元素相同:直接复用之前的真实dom
  • 如果key不同直接将新的虚拟dom元素渲染到页面生成新的真实dom元素

在这里插入图片描述

如果没有指定标签的key属性,会自动拿index作为key属性的值, 这种方式效率低复用性差, 另外操作数组当中的非末尾元素时容易发生错乱

  • 选中页面上全部的复选框, 此时的真实DOM就是选中时的状态,所以复用时添加的tom也是选中的状态

在这里插入图片描述

<body><div id="app"><h1>{{msg}}</h1><button @click="addFirst">在数组第一个位置添加 tom</button><button @click="addLast">在数组最后位置添加 vue</button><table><tr><th>序号</th><th>姓名</th><th>邮箱</th><th>选择</th></tr><tr v-for="(vip,index) of vips" :key="index"><td>{{index + 1}}</td><td>{{vip.name}}</td><td>{{vip.email}}</td><td><input type="checkbox"></td></tr></table></div><script>const vm = new Vue({el : '#app', data : {msg : 'key原理(虚拟dom与diff算法)', vips : [{id:'100',name:'jack',email:'jack@123.com'}, {id:'200',name:'lucy',email:'lucy@123.com'}, {id:'300',name:'james',email:'james@123.com'}]}, methods : {addFirst(){this.vips.unshift({id:'400',name:'tom',email:'tom@123.com'})}, addLast(){this.vips.push({id:'500',name:'vue',email:'vue@123.com'})}}})</script>
</body>

指定对象的id作为key属性的值 , 因为id是唯一的所以不会出现错乱问题

在这里插入图片描述

列表过滤和排序

列表过滤

监视文本框中输入的数据,根据用户输入的关键字对原数组进行过滤,将新数组渲染到页面

  • 使用watch配置项:需要定义一个数组用来接收过滤后的数组
  • 使用computed配置项:不需要定义数组,直接返回过滤后的数组就是计算属性的值
let arr = [1,2,3,4,5,6,7,8,9]
// filter不会破坏原数组的结构,会生成一个全新的数组
let newArr = arr.filter((num) => {//return 过滤规则return num < 5
})console.log(newArr)
<body><div id="app"><h1>{{msg}}</h1><input type="text" placeholder="请输入搜索关键字" v-model="keyword"><table><tr><th>序号</th><th>英雄</th><th>能量值</th><th>选择</th></tr><tr v-for="(hero,index) in filteredHeros" :key="hero.id"><td>{{index+1}}</td><td>{{hero.name}}</td><td>{{hero.power}}</td><td><input type="checkbox"></td></tr></table></div><script>const vm = new Vue({el : '#app',data : {keyword : '',msg : '列表过滤',heros : [{id:'101',name:'艾格文',power:10000},{id:'102',name:'麦迪文',power:9000},{id:'103',name:'古尔丹',power:8000},{id:'104',name:'萨尔',power:6000}],filteredHeros : []},watch : {// 页面初次加载时就调用handler函数keyword : {immediate : true,handler(val){this.filteredHeros = this.heros.filter((hero) => {// 执行过滤规则return hero.name.indexOf(val) >= 0})}}}computed : {filteredHeros(){// 返回数组作为计算属性的值return this.heros.filter((hero) => {// 执行过滤规则return hero.name.indexOf(this.keyword) >= 0})}}})</script>
</body>

列表排序

let arr = [8,9,5,4,1,2,3]
// sort方法排序之后,不会生成一个新的数组,是在原数组的基础之上进行排序,会影响原数组的结构
arr.sort((a, b) => {return b - a
})
console.log(arr)
<body><div id="app"><h1>{{msg}}</h1><input type="text" placeholder="请输入搜索关键字" v-model="keyword"><button @click="type = 1">升序</button><button @click="type = 2">降序</button><button @click="type = 0">原序</button><table><tr><th>序号</th><th>英雄</th><th>能量值</th><th>选择</th></tr><tr v-for="(hero,index) in filteredHeros" :key="hero.id"><td>{{index+1}}</td><td>{{hero.name}}</td><td>{{hero.power}}</td><td><input type="checkbox"></td></tr></table></div><script>const vm = new Vue({el : '#app',data : {type : 0,keyword : '',msg : '列表排序',heros : [{id:'101',name:'艾格文',power:10000},{id:'102',name:'麦迪文',power:9000},{id:'103',name:'古尔丹',power:8000},{id:'104',name:'萨尔',power:11000}]},computed : {filteredHeros(){//  排序会影响原数组的结构const arr = this.heros.filter((hero) => {// 执行过滤规则return hero.name.indexOf(this.keyword) >= 0})// 排序if(this.type === 1){// a和b是一个对象arr.sort((a, b) => {return a.power - b.power})}else if(this.type == 2){arr.sort((a, b) => {return b.power - a.power})}// 返回新数组作为计算属性的值return arr}}})</script>
</body>

收集表单数据

收集表单数据

阻止表单的默认提交行为的方式

  • 给form标签添加@submit.prevent
  • 给button按钮添加@click.prevent
<body><div id="app"><h1>{{msg}}</h1><!--阻止表单的默认提交行为--><form @submit.prevent="send"><!--v-model.trim去除字符串的前后空白-->用户名:<input type="text" v-model.trim="user.username"><br><br>密码:<input type="password" v-model="user.password"><br><br><!--v-model.number可以将收集到的字符串转化为数字保存-->年龄:<input type="number" v-model.number="user.age"><br><br>性别:<!--同一组(name属性值相同)的单选按钮才只能选一个--><input type="radio" name="gender" value="1" v-model="user.gender"><input type="radio" name="gender" value="0" v-model="user.gender"><br><br>爱好:<!--对于checkbox来说,如果没有手动指定value,那么会拿这个标签的checked属性的值作为value(选中为true,未选中为false)-->旅游<input type="checkbox" v-model="user.interest" value="travel">运动<input type="checkbox" v-model="user.interest" value="sport">唱歌<input type="checkbox" v-model="user.interest" value="sing"><br><br>学历:<select v-model="user.grade"><option value="">请选择学历</option><option value="zk">专科</option><option value="bk">本科</option><option value="ss">硕士</option></select><br><br>简介:<!--标签体当中的内容就是文本域的value--><!--v-model.lazy失去焦点后才开始收集表单数据--><textarea cols="50" rows="15" v-model.lazy="user.introduce"></textarea><br><br><input type="checkbox" v-model="user.accept">阅读并接受协议<br><br><!--<button @click.prevent="send">注册</button>--><button>注册</button></form></div><script>const vm = new Vue({el : '#app',data : {user : {username : '',password : '',age : '',// 默认选中指定表单的value值gender : '1',// 复选框的value采用数组接收interest : ['travel'],grade : 'ss',introduce : '',accept : ''},msg : '表单数据的收集'},methods : {send(){alert('ajax...!!!!')// 将数据收集好,发送给服务器console.log(JSON.stringify(this.user))}}})</script>
</body>

过滤器filters

过滤器filters

过滤器适用于简单的逻辑处理,可以进行全局配置或局部配置

  • 全局配置:在构建任何Vue实例之前使用Vue.filter(‘过滤器名称’, callback)进行配置,可以在任何一个容器中使用
  • 局部配置:在构建Vue实例的配置项中使用filters 进行局部配置,只能在当前绑定的容器中使用

过滤器可以用在插值语法和v-bind指令中,可以对一些数据进行格式化显示

  • 过滤器也可以接收额外的参数,但过滤器的第一个参数永远接收的都是前一个过滤器的返回值
  • 多个过滤器可以串联{{msg | filterA | filterB | filterC}}
  • 由于过滤器的功能完全可以使用methods,computed 来实现,在Vue3当中已经将过滤器语法废弃了
<body><!--从服务器端返回一个商品的价格price,如果price的值是''、null、undefined页面上统一显示为 - , 反之显示真实的数字--><div id="app"><h1>{{msg}}</h1><h2>商品价格:{{formatPrice}}</h2><h2>商品价格:{{formatPrice2()}}</h2><h2>商品价格:{{price | filterA | filterB(3)}}</h2><input type="text" :value="price | filterA | filterB(3)"></div><!--在另一个容器中使用全局的过滤器--><div id="app2"><h2>商品价格:{{price | filterA | filterB(3)}}</h2></div><script>// 配置全局的过滤器可以在另一个容器中使用Vue.filter('filterA', function(val){if(val === null || val === undefined || val === ''){return '-'}return val})Vue.filter('filterB', function(val, number){return val.toFixed(number)})const vm2 = new Vue({el : '#app2',data : {price : 20.3}})const vm = new Vue({el : '#app',data : {msg : '过滤器',price : 50.6},methods: {formatPrice2(){if(this.price === '' || this.price === undefined || this.price === null){return '-'}return this.price}},computed : {formatPrice(){if(this.price === '' || this.price === undefined || this.price === null){return '-'}return this.price}},// 局部过滤器filters : {filterA(val){if(val === null || val === undefined || val === ''){return '-'}return val},filterB(val, number){// 确保传递过来的数据val,保留number位小数return val.toFixed(number)}} })</script>
</body>

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

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

相关文章

人工智能在增强数据安全方面的作用

近年来&#xff0c;人工智能&#xff08;AI&#xff09;的力量已被证明是无与伦比的。它不再是我们想象的主题。人工智能已经成为现实&#xff0c;并且越来越清楚地表明它可以让世界变得更美好。但人工智能能帮助我们增强数据安全吗&#xff1f; 由于技术的日益普及&#xff0…

概率与常见的概率分布

概率是数据分析、机器学习中最基础的知识。也是在生活中最实用的一门学科&#xff0c;学了很多大道理不一定能过好一生&#xff0c;学好概率则有一定概率会变得更好。为大概率坚持&#xff0c;为小概率备份。 概率与分布 要想了解概率&#xff0c;首先得搞清楚概率和概率分布的…

力扣L9--- 12. 整数转罗马数字--2024年3月12日

1.题目 2.知识点 &#xff08;1&#xff09;HaspMap的一些基本语法 1&#xff09;创建 HashMap&#xff0c;用于存储键为 String 类型、值为 Integer 类型的键值对。 HashMap<String, Integer> map new HashMap<>();2&#xff09;添加键值对&#xff1a; map.p…

Python 基础语法:基本数据类型(集合)

1 集合&#xff08;Set&#xff09;的基本概念和特性 集合是一个无序的、不重复的元素序列。集合中的元素是唯一的&#xff0c;即集合中不会出现重复的元素。集合的主要作用是进行成员关系测试和消除重复元素。 集合的特性&#xff1a; 无序&#xff1a;序列是有序的&#…

PTA L1-009 N个数求和(C++)

本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤100&#xff09;。随后一行按格式a1/b1 a2/b2 …

DAY14二叉树迭代遍历

二叉树前序迭代法遍历 前序遍历是中左右&#xff0c;每次先处理的是中间节点&#xff0c;那么先将根节点放入栈中&#xff0c;然后将右孩子加入栈&#xff0c;再加入左孩子。 为什么要先加入 右孩子&#xff0c;再加入左孩子呢&#xff1f; 因为这样出栈的时候才是中左右的顺…

刷题日记——01字符串、非素数个数(厦门大学机试)

题目1——01字符串 分析 经过拆解找规律&#xff0c;发现是两个斐波那契 那么代码就好写了呀 #include <stdio.h>unsigned long long f(int n){if(n0||n1){return n;}return (f(n-1)f(n-2))%2333333; }int main(){int n;scanf("%d",&n);printf("%…

Python实战:Python内置数据类型

Python是一种广泛应用于各种领域的编程语言&#xff0c;其内置数据类型是Python编程的基础。本文将详细介绍Python内置数据类型&#xff0c;包括数字、字符串、列表、元组、字典和集合等&#xff0c;并通过具体代码示例来帮助读者更好地理解和应用这些数据类型。 1. 数字 Pyt…

2.Datax数据同步之Windows下,mysql和sqlserver之间的自定义sql文数据同步

目录 前言步骤操作大纲步骤明细mysql 至 sqlServersqlServer 至 mysql执行同步语句中报 前言 上一篇文章实现了不同的mysql数据库之间的数据同步&#xff0c;在此基础上本篇将实现mysql和sqlserver之间的自定义sql文数据同步 准备工作&#xff1a; JDK(1.8以上&#xff0c;推…

亲测抖音小程序备案流程,抖音小程序如何备案,抖音小程序备案所需准备资料

抖音小程序为什么要备案&#xff0c;抖音官方给出如下说明&#xff1a; 1、2024年3月15日后提交备案的小程序将不保证2024年3月31日前平台可初审通过&#xff1b; 2、2024年3月31日后未完成备案小程序将被下架处理。 一&#xff0c;备案前需准备资料 &#xff08;一&#xff0…

BUUCTF-----[SWPU2019]Web1

打开页面&#xff0c;原本以为是二次注入,结果不是&#xff0c;先注册一个账户 在申请发布广告中&#xff0c;发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试&#xff0c;发现系统过滤了#&#xff0c;or&#xff0c;空格 orde…

《Fallacies of Distributed Systems》原文手译

Fallacies of Distributed Systems 分布式系统的谬误 Fallacies of distributed systems are a set of assertions made by L Peter Deutsch and others at Sun Microsystems describing false assumptions that programmers new to distributed applications invariably mak…

高性能 数据库连接池 HikariCP | 连接池大小配置误区

👀 上节回顾:上一节对 HikariCP 数据源的配置进行了详细了解。 👉 本节目标:关于连接池大小的设定,有一定的误区,必读。【没想到,有误区😂】 连接池越大越好?No!!! 有这样的场景:10000 个并发前端用户,每秒 2000 个事务执行,如何配置连接池的大小?配 200?配…

已解决org.apache.hadoop.hdfs.protocol.QuotaExceededException异常的正确解决方法,亲测有效!!!

已解决org.apache.hadoop.hdfs.protocol.QuotaExceededException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 总结 博主v&#xff1a;XiaoMing_Java 问题分析 在使用Hadoop分布式文件系统&a…

java中string类型常用的37个函数

java中string类型常用的37个函数—无极低码 int indexOf(int ch, int fromIndex) 、int indexOf(int ch) 、int indexOf(String str, int fromIndex) 、int indexOf(String str) 、int lastIndexOf(int ch, int fromIndex) 、int lastIndexOf(int ch) 、int lastIndexOf(Strin…

2063:【例1.4】牛吃牧草

时间限制: 1000 ms 内存限制: 65536 KB 提交数:104458 通过数: 64963 【题目描述】 有一个牧场&#xff0c;牧场上的牧草每天都在匀速生长&#xff0c;这片牧场可供15头牛吃20天&#xff0c;或可供20头牛吃10天&#xff0c;那么&#xff0c;这片牧场每天新生的草量…

26-4 SQL注入攻击 - 不同数据库系统利用dnslog姿势

环境准备:SQL注入攻击 - SQL注入无回显,盲注又被封怎么办?-CSDN博客 构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、MySQL 在 MySQL 数据库管理系统中,可以利用 load_file 函数来执行文件读取操作,并通过注入恶意代码来触发 DNS…

程序分享--排序算法--归并排序

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

操作系统--LRU算法,手撕

今天研究一下LRU算法&#xff0c;上学期学数据结构的时候就应该学一下这个算法&#xff0c;不过后面操作系统也会讲到LRU算法 题目 LRU缓存leetocde146 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;算法是一种常见的缓存替换算法&#xff0c;通…

windows系统图标变白设置

我们在使用系统的时候&#xff0c;通常会在桌面创建图标&#xff0c;有时候桌面图标过多&#xff0c;整理图标放在新建文件夹的时候&#xff0c;图标变白&#xff0c;通常情况下都是缓存问题&#xff0c;这里也是删除缓存解决演示系统&#xff1a;windows11 1显示图标缓存目录 …