详解为什么Vue中的v-if和v-for不建议一起用


Posted in Vue.js onJanuary 13, 2021

本文主要介绍了为什么v-if和v-for不建议一起用?分享给大家,具体如下:

详解为什么Vue中的v-if和v-for不建议一起用

一、作用

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 true值的时候被渲染

v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组或者对象,而 item 则是被迭代的数组元素的别名

在 v-for 的时候,建议设置key值,并且保证每个key值是独一无二的,这便于diff算法进行优化

两者在用法上

<Modal v-if="isShow" />
 
<li v-for="item in items" :key="item.id">
  {{ item.label }}
</li>

二、优先级

v-if与v-for都是vue模板系统中的指令

在vue模板编译的时候,会将指令系统转化成可执行的render函数

示例

编写一个p标签,同时使用v-if与 v-for

<div id="app">
  <p v-if="isShow" v-for="item in items">
    {{ item.title }}
  </p>
</div>

创建vue实例,存放isShow与items数据

const app = new Vue({
 el: "#app",
 data() {
  return {
   items: [
    { title: "foo" },
    { title: "baz" }]
  }
 },
 computed: {
  isShow() {
   return this.items && this.items.length > 0
  }
 }
})

模板指令的代码都会生成在render函数中,通过app.$options.render就能得到渲染函数

ƒ anonymous() {
 with (this) { return 
  _c('div', { attrs: { "id": "app" } }, 
  _l((items), function (item) 
  { return (isShow) ? _c('p', [_v("\n" + _s(item.title) + "\n")]) : _e() }), 0) }
}

_l是vue的列表渲染函数,函数内部都会进行一次if判断

初步得到结论:v-for优先级是比v-if高

再将v-for与v-if置于不同标签

<div id="app">
  <template v-if="isShow">
    <p v-for="item in items">{{item.title}}</p>
  </template>
</div>

再输出下render函数

ƒ anonymous() {
 with(this){return 
  _c('div',{attrs:{"id":"app"}},
  [(isShow)?[_v("\n"),
  _l((items),function(item){return _c('p',[_v(_s(item.title))])})]:_e()],2)}
}

这时候我们可以看到,v-for与v-if作用在不同标签时候,是先进行判断,再进行列表的渲染

我们再在查看下vue源码

源码位置:\vue-dev\src\compiler\codegen\index.js

export function genElement (el: ASTElement, state: CodegenState): string {
 if (el.parent) {
  el.pre = el.pre || el.parent.pre
 }
 if (el.staticRoot && !el.staticProcessed) {
  return genStatic(el, state)
 } else if (el.once && !el.onceProcessed) {
  return genOnce(el, state)
 } else if (el.for && !el.forProcessed) {
  return genFor(el, state)
 } else if (el.if && !el.ifProcessed) {
  return genIf(el, state)
 } else if (el.tag === 'template' && !el.slotTarget && !state.pre) {
  return genChildren(el, state) || 'void 0'
 } else if (el.tag === 'slot') {
  return genSlot(el, state)
 } else {
  // component or element
  ...
}

在进行if判断的时候,v-for是比v-if先进行判断

最终结论:v-for优先级比v-if高

三、注意事项

永远不要把 v-if 和 v-for 同时用在同一个元素上,带来性能方面的浪费(每次渲染都会先循环再进行条件判断)

如果避免出现这种情况,则在外层嵌套template(页面渲染不生成dom节点),在这一层进行v-if判断,然后在内部进行v-for循环

<template v-if="isShow">
  <p v-for="item in items">
</template>

如果条件出现在循环内部,可通过计算属性computed提前过滤掉那些不需要显示的项

computed: {
  items: function() {
   return this.list.filter(function (item) {
    return item.isShow
   })
  }
}

参考文献

https://vue3js.cn/docs/zh\

到此这篇关于详解为什么Vue中的v-if和v-for不建议一起用的文章就介绍到这了,更多相关v-if和v-for不建议一起用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue监听滚动事件的方法
Dec 21 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
vue 页面跳转的实现方式
Jan 12 Vue.js
如何在 Vue 表单中处理图片
Jan 26 Vue.js
Vue项目打包部署到apache服务器的方法步骤
Feb 01 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
vue实现可拖拽的dialog弹框
May 13 Vue.js
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
vue自定义组件实现双向绑定
Jan 13 #Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 #Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 #Vue.js
vue 页面跳转的实现方式
Jan 12 #Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 #Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 #Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 #Vue.js
You might like
PHP爆绝对路径方法收集整理
2012/09/17 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
Python实现简单拆分PDF文件的方法
2015/07/30 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
详解python的super()的作用和原理
2020/10/29 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
送货司机岗位职责
2013/12/11 职场文书
学前教育毕业生自荐信范文
2013/12/24 职场文书
党校学习自我鉴定
2014/02/24 职场文书
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
教师业务培训方案
2014/05/01 职场文书
经费申请报告范文
2015/05/18 职场文书
走进科学观后感
2015/06/18 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python
pandas中对文本类型数据的处理小结
2021/11/01 Python
nginx设置资源请求目录的方式详解
2022/05/30 Servers