Vue学习篇(一):v-if与v-show区别
每一个记录展示模块的标题和内容都不是固定的,需要预先写好每一个记录块的标题,再将后端回显内容填充进去。
写一个数组,用v-for去循环每一项,将标题渲染出来,也后期方便修改。
data() {
return {
// 物料信息标题
materialInfoTitle: [
{ content1:"物料编号", content2: "物料名称", content3: "物料数量", content4: "物料位置" },
{ content1: "物料名称", content2: "数量", content3: "物料来源", content4: "入库时间" },
{ content1: "物料名称", content2: "数量", content3: "接收厂家", content4: "出库时间" },
{ content1: "物料名称", content2: "数量", content3: "接收人", content4: "内调时间" }
]
}
}
1.v-if指令
<div v-for="(item, index) in materiallist" :key="index" class="record">
<!-- 物料title 第一项 -->
<div class="list" >
<span v-if="active === 0" class="title" >{{materialInfoTitle[active].content1}}: {{item.id}}</span>
<span v-if="active !== 0" class="title" >{{materialInfoTitle[active].content1}}: {{item.materialtitle}}</span>
</div>
<!-- 物料title 第二项 -->
<div class="list" >
<span v-if="active === 0" class="title" >{{materialInfoTitle[active].content2}}: {{item.materialtitle}}</span>
<span v-if="active !== 0" class="title" >{{materialInfoTitle[active].content2}}: {{item.count}}</span>
</div>
<!-- 物料title 第三项 -->
<div class="list" >
<span v-if="active === 0" class="title" >{{materialInfoTitle[active].content3}}: {{item.materialCount}}</span>
<span v-if="active === 1 || active === 2" class="title" >{{materialInfoTitle[active].content3}}: {{item.materialSource</span>
<span v-if="active === 3" class="title" >{{materialInfoTitle[active].content3}}: {{item.take}}</span>
</div>
<!-- 物料title 第四项 -->
<div class="list" >
<span v-if="active === 0" class="title" >{{materialInfoTitle[active].content4}}: {{item.position}}</span>
<span v-if="active === 1 || active === 2" class="title" >{{materialInfoTitle[active].content4}}: {{item.addTime}}</span>
<span v-if="active === 3" class="title" >{{materialInfoTitle[active].content4}}: {{item.handoverTime}}</span>
</div>
<div class="hr"></div>
<div class="btn">
<div class="add" :data-id="item.id" @click="edit">
编辑
</div>
<div class="del" :data-id="item.id" @click="del">
删除
</div>
</div>
</div>
非常麻烦,代码也十分的不容易解读,但这不是今天的重点。一开始我用的是v-if指令来判断每一项标题的显示,看起来似乎完美实现了想要的效果,但当展示信息变得很多时候,每一次切换active值,页面都会造成小小的等待卡顿效果。这显然不是我们想要看到的
2.v-show指令
<div v-for="(item, index) in materiallist" :key="index" class="record">
<!-- 物料title 第一项 -->
<div class="list" >
<span v-show="active === 0" class="title" >{{materialInfoTitle[active].content1}}: {{item.id}}</span>
<span v-show="active !== 0" class="title" >{{materialInfoTitle[active].content1}}: {{item.materialtitle}}</span>
</div>
<!-- 物料title 第二项 -->
<div class="list" >
<span v-show="active === 0" class="title" >{{materialInfoTitle[active].content2}}: {{item.materialtitle}}</span>
<span v-show="active !== 0" class="title" >{{materialInfoTitle[active].content2}}: {{item.count}}</span>
</div>
<!-- 物料title 第三项 -->
<div class="list" >
<span v-show="active === 0" class="title" >{{materialInfoTitle[active].content3}}: {{item.materialCount}}</span>
<span v-show="active === 1 || active === 2" class="title" >{{materialInfoTitle[active].content3}}: {{item.materialSource</span>
<span v-show="active === 3" class="title" >{{materialInfoTitle[active].content3}}: {{item.take}}</span>
</div>
<!-- 物料title 第四项 -->
<div class="list" >
<span v-show="active === 0" class="title" >{{materialInfoTitle[active].content4}}: {{item.position}}</span>
<span v-show="active === 1 || active === 2" class="title" >{{materialInfoTitle[active].content4}}: {{item.addTime}}</span>
<span v-show="active === 3" class="title" >{{materialInfoTitle[active].content4}}: {{item.handoverTime}}</span>
</div>
<div class="hr"></div>
<div class="btn">
<div class="add" :data-id="item.id" @click="edit">
编辑
</div>
<div class="del" :data-id="item.id" @click="del">
删除
</div>
</div>
</div>
当我们把v-if指令切换成v-show,我们就会发现,每一个标题内容都会被渲染一次,再根据元素的css的属性控制元素显示隐藏,当active切换时候,就无需再次去加载标题内容,而是通过切换css样式来实现内容切换,加快了速度。active值的切换不会变得卡顿。
3.v-show与v-if区别
官方解释:
-
v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
-
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
-
相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
-
一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
个人理解:
- 相同点:v-show和v-if都能控制元素的显示和隐藏。
- 不同点:
- 实现本质方法不同
- v-show 本质就是通过设置css中的display设置为none,控制隐藏
- v-if 是动态的向DOM树内添加或者删除DOM元素
- 编译的区别
- v-show 其实就是在控制css
- v-if 切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件
- 编译的条件
- v-show 都会编译,初始值为false,只是将display设为none,但它也编译了
- v-if 初始值为false,就不会编译了
- 性能
- v-show 只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,故v-show性能更好一点。
- 注意点:因为v-show实际是操作display:" "或者none,当css本身有display:none时,v-show无法让其显示