Vue 基础自查——条件渲染和列表渲染
v-if
和v-show
的区别是什么?v-if
和v-for
为什么不能一起用?v-for
中的key
有什么作用?
1 v-if 和 v-show
1.1 作用
都用来控制元素的显示和隐藏
1.2 控制元素显隐的方式
v-if
控制虚拟DOM
树上元素的创建和销毁,Vue
的响应系统会根据虚拟DOM
树对实际DOM
进行更新,从而间接控制实际DOM
上元素的显隐
v-show
通过给元素添加样式display:none
来让元素隐藏
1.3 初始渲染对比
v-if
是惰性的,如果初始渲染条件为false
,什么都不做;只有条件为true
,才会开始编译
v-show
不管初始渲染条件如何,元素始终被编译并保留,之后根据条件通过CSS
切换
1.4 切换消耗对比
如果频繁切换显示与隐藏,v-if
会频繁创建、销毁元素,而v-show
只是切换样式
故v-if
的切换消耗更高
1.5 使用场景对比
如果元素的显示隐藏在一开始就定下来不会再变了,使用v-if
如果元素需要频繁切换显隐,使用v-show
1.6 其他
v-if
可以搭配template
使用,v-show
不可以v-if
可以搭配v-else
,v-show
无特殊语法
2 v-if 和 v-for
2.1 v-if 和 v-for 不能同时用的原因
为什么不能把v-if
和v-for
同时用在同一个元素上?
当 Vue 处理指令的时候,v-for
的优先级比v-if
高,因此这个模板:
<ul>
<li v-for="item in list" v-if="item.isActive" :key="item.id">
{{item.name}}
</li>
</ul>
会经过如下运算:
this.list.map(function(item) {
if (item.isActive) {
return item.name
}
})
我们每次重新渲染的时候都要遍历整个列表,即使isActive
为true
的item
很少,这会带来性能方面的极大浪费,因此两者不能同时用在同一个元素上
2.2 v-if 和 v-for 一起用的解决方案
1、如果想控制整个列表的显隐,可以将v-if
移动到容器元素上,比如:
<body>
<div id="example">
<ul v-if="listShow">
<li v-for="item in activeItems" :key="item.id">{{item.name}}</li>
</ul>
</div>
</body>
<script>
const vm = new Vue({
el: "#example",
data: {
list: [
{ id: 1, name: "路飞", isActive: true },
{ id: 2, name: "索隆", isActive: false },
{ id: 3, name: "山治", isActive: true },
],
listShow: false,
}
});
</script>
2、如果想过滤列表中的项目,可以使用计算属性(computed
)返回过滤后的列表,比如:
<body>
<div id="example">
<ul>
<li v-for="item in activeItems" :key="item.id">{{item.name}}</li>
</ul>
</div>
</body>
<script>
const vm = new Vue({
el: "#example",
data: {
list: [
{ id: 1, name: "路飞", isActive: true },
{ id: 2, name: "索隆", isActive: false },
{ id: 3, name: "山治", isActive: true },
],
},
computed: {
activeItems: function () {
return this.list.filter((item) => item.isActive);
},
},
});
</script>
3 列表渲染的 key 有什么用
在使用v-for
进行列表渲染时,必须给元素添加一个key
属性,并且这个key
必须是唯一标识
<ul>
<li v-for="item in list" :key="item.id">{{item.name}}</li>
</ul>
我们知道,Vue 在更新元素时,不会直接操作真实DOM(渲染真实DOM开销是很大的),而是根据新数据生成新的虚拟 DOM,然后对新旧虚拟DOM进行差异对比,根据对比结果进行DOM操作来更新视图
列表渲染时,如果有key
属性,由于它是唯一标识,在对比两个新旧节点时若key
不同也就没有深入对比的必要了。
为什么不能用index
作为key
?因为index
是不稳定可变的,比如删除了列表第一个元素,会导致后面的元素index
发生变化,从而导致key
发生变化。这时,Vue 在对比新旧节点时,遇到key
相同的节点,就会进行深入对比,发现节点内容发生了变化,就会去创建新的真实DOM用来替换原来的真实DOM。原本只需要删除真实DOM中第一个元素的操作,会变成新建、替换后续所有真实DOM,造成性能的极大浪费
Vue 基础自查——条件渲染和列表渲染的更多相关文章
- Vue学习计划基础笔记(三)-class与style绑定,条件渲染和列表渲染
Class与style绑定.条件渲染和列表渲染 目标: 熟练使用class与style绑定的多种方式 熟悉v-if与v-for的用法,以及v-if和v-for一起使用的注意事项 class与style ...
- 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法
Vue框架常用知识点 文章目录 Vue框架常用知识点 知识点解释 第一个vue应用 模板语法 计算属性与侦听器 条件渲染.列表渲染.Class与Style绑定 知识点解释 vue框架知识体系 [1]基 ...
- react 入坑笔记(五) - 条件渲染和列表渲染
条件渲染和列表渲染 一.条件渲染 条件渲染较简单,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI. 贴一个小栗子: funct ...
- vue学习笔记(五)条件渲染和列表渲染
前言 在众多的编程语言中,我们的基础语法总是少不了一些专业语法,比如像定义变量,条件语句,for循环,数组,函数等等,vue.js这个优秀的前端框架中也有同样的语法,我们换一个名词,将条件语句改成专业 ...
- Vue.js学习 Item7 -- 条件渲染与列表渲染
v-if 在字符串模板中,如 Handlebars,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}} <h1>Yes</h1 ...
- angular,vue,react的基本语法—双向数据绑定、条件渲染、列表渲染、angular小案例
基本语法: 1.双向数据绑定 vue 指令:v-model="msg" react constructor(){ this.state{ msg:"双向数据绑定" ...
- vue的条件渲染和列表渲染介绍
一.条件渲染 1.v-if语句 <div v-if="seen">hahahah</div> <!-- v-if插入或者删除元素的指令 --> ...
- vue 条件渲染与列表渲染
本文是对官方文档的整理 因为 v-if 是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v ...
- vue class与style绑定、条件渲染、列表渲染
列表渲染 根据我例子的需要,先来说下,列表渲染使用到的是v-for指令,需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名,具体使用方法 ...
随机推荐
- Shell系列(8)- 变量与变量分类(1)
变量命名规则 开头为字符或下划线,名字中间中能有字母.数字和下划线组成; 变量的长度不超过255个字符; 变量名在有效的范围内必须是唯一的; 如再次定义则会替换上一个变量的值 在Bash中,变量的默认 ...
- 腾讯云centos7.5安装jdk1.8
手动解压安装包方法 在user目录下新建java文件夹 cd /usr/ mkdir java 把jdk安装包移动到java目录下 我已经提前下载jdk的tar包 mv jdk-8u251-linux ...
- P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】
正题 题目链接:https://www.luogu.com.cn/problem/P4548 题目大意 \(t\)次询问,给出一个长度为\(m\)的串\(S\)和一个空串\(T\),每次在\(T\)后 ...
- Loj#6053-简单的函数【Min25筛】
正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数\(f(p^c)=p\ xor\ c\),求\(\sum_{i=1}^nf(i)\) 解题思路 异或这个东西不太好 ...
- selenium--常用判断
获取页面 title 的方法可以直接用 driver.title 获取到,然后也可以把获取到的结果用做断言.1.首先导入 expected_conditions 模块:from selenium.we ...
- React-高阶函数_函数柯里化
高阶函数_函数柯里化 高阶函数(定义) 如果一个函数符合下面两个规范,就是高阶函数: 如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item ...
- 淘宝商品html--网页结构
淘宝商品html--网页结构 本篇爬虫紧接上一篇关于 泸州老窖 的爬虫随笔: import re import json def get_space_end(level): return ' ' * ...
- Python代码阅读(第10篇):随机打乱列表元素
本篇阅读的代码实现了随机打乱列表元素的功能,将原有列表乱序排列,并返回一个新的列表(不改变原有列表的顺序). 本篇阅读的代码片段来自于30-seconds-of-python. shuffle fro ...
- 安装SpaCy出现报错:requests.exceptions.ConnectionError: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443):
内含安装步骤及报错解决:https://www.cnblogs.com/xiaolan-Lin/p/13286885.html
- python paramiko实现ssh上传下载执行命令
paramiko ssh上传下载执行命令 序言 最近项目经常需要动态在跳板机上登录服务器进行部署环境,且服务器比较多,每次完成所有服务器到环境部署执行耗费大量时间.为了解决这个问题,根据所学的执行实现 ...