1. v-ifv-show的区别是什么?
  2. v-ifv-for为什么不能一起用?
  3. 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-elsev-show无特殊语法

2 v-if 和 v-for

2.1 v-if 和 v-for 不能同时用的原因

为什么不能把v-ifv-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
}
})

我们每次重新渲染的时候都要遍历整个列表,即使isActivetrueitem很少,这会带来性能方面的极大浪费,因此两者不能同时用在同一个元素上

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 基础自查——条件渲染和列表渲染的更多相关文章

  1. Vue学习计划基础笔记(三)-class与style绑定,条件渲染和列表渲染

    Class与style绑定.条件渲染和列表渲染 目标: 熟练使用class与style绑定的多种方式 熟悉v-if与v-for的用法,以及v-if和v-for一起使用的注意事项 class与style ...

  2. 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法

    Vue框架常用知识点 文章目录 Vue框架常用知识点 知识点解释 第一个vue应用 模板语法 计算属性与侦听器 条件渲染.列表渲染.Class与Style绑定 知识点解释 vue框架知识体系 [1]基 ...

  3. react 入坑笔记(五) - 条件渲染和列表渲染

    条件渲染和列表渲染 一.条件渲染 条件渲染较简单,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI. 贴一个小栗子: funct ...

  4. vue学习笔记(五)条件渲染和列表渲染

    前言 在众多的编程语言中,我们的基础语法总是少不了一些专业语法,比如像定义变量,条件语句,for循环,数组,函数等等,vue.js这个优秀的前端框架中也有同样的语法,我们换一个名词,将条件语句改成专业 ...

  5. Vue.js学习 Item7 -- 条件渲染与列表渲染

    v-if 在字符串模板中,如 Handlebars,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}} <h1>Yes</h1 ...

  6. angular,vue,react的基本语法—双向数据绑定、条件渲染、列表渲染、angular小案例

    基本语法: 1.双向数据绑定 vue 指令:v-model="msg" react constructor(){ this.state{ msg:"双向数据绑定" ...

  7. vue的条件渲染和列表渲染介绍

    一.条件渲染 1.v-if语句 <div v-if="seen">hahahah</div> <!-- v-if插入或者删除元素的指令 --> ...

  8. vue 条件渲染与列表渲染

    本文是对官方文档的整理 因为 v-if 是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v ...

  9. vue class与style绑定、条件渲染、列表渲染

    列表渲染 根据我例子的需要,先来说下,列表渲染使用到的是v-for指令,需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名,具体使用方法 ...

随机推荐

  1. php在类中使用回调函数 如array_map

    <?php class foo {   var $var;   function bar() {      array_map(array($this, "baz"), ar ...

  2. Linux系列(28) - 软件包简介

    软件包分类 源码包(脚本安装包) 优点 开源,如果有足够的能力,可以修改源代码: 可以自由选择所需的功能: 软件是编译安装,所以更加适合自己的系统,更加稳定.效率更高: 卸载方便: 缺点 安装过程步骤 ...

  3. Java面向对象系列(14)- 接口的定义与实现

    接口 普通类:只有具体实现 抽象类:具体实现和规范(抽象方法)都有 接口:只有规范!约束和实现分离 接口就是规范,定义的是一组规则,体现了现实世界中"如果你是-则必须能-"的思想. ...

  4. Spring Cloud Hystrix 学习(三)请求合并

    什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...

  5. css 常用语法

    1.禁止某个元素内的任何选中操作: .classname{ -webkit-user-select: none; -moz-user-select: none; -ms-user-select: no ...

  6. Qt和JavaScript使用QWebChannel交互一——和Qt内嵌网页交互

    Qt和JavaScript使用QWebChannel交互一--和Qt内嵌网页交互 目录 Qt和JavaScript使用QWebChannel交互一--和Qt内嵌网页交互 前言 一.效果 二.实现过程 ...

  7. Django整理(二) - 视图和模板的初步使用

    Django中的视图 · Django使用视图来编写web应用的业务逻辑 · Django的视图也就是一个函数,可称为视图函数 · 视图定义在应用的view.py文件中 · 视图需要绑定一个URL地址 ...

  8. 11.2.0.4 ORA-15025 ORA-27041 IBM AIX RISC System/6000 Error: 13: Permission denied

    ASM device error ORA-27041 ORA-15025 ORA-15081 (Doc ID 1487475.1) 描述总结:数据库的alert中发现大量ORA-27041 ORA-1 ...

  9. 题解 AVL 树

    link Description 给出一个 \(n\) 个点的 AVL 树,求保留 \(k\) 个点使得字典序最小. \(n\le 5\times 10^5\) Solution 因为我很 sb ,所 ...

  10. SpringBoot入门08-整合Mabatis

    整合所需的依赖 注解方式和映射文件方式的mybatis都可以被整合进springboot 创建springboot的web项目后,在pom加入spring-mybatis和mysql-jdbc和thy ...