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,造成性能的极大节约
公众号【前端嘛】