详解为什么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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
vue+iview实现分页及查询功能
Nov 17 Vue.js
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
vue中watch的用法汇总
Dec 28 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
Vue SPA 首屏优化方案
Feb 26 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
vue如何清除浏览器历史栈
May 25 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
Javascript 复制数组实现代码
2009/11/26 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
js实现进度条的方法
2015/02/13 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python dumps和loads区别详解
2020/02/04 Python
django中嵌套的try-except实例
2020/05/21 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
运动会领导邀请函
2014/01/10 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
小鞋子观后感
2015/06/05 职场文书
配置Kubernetes外网访问集群
2022/03/31 Servers
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL