详解为什么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 07 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
Vue实现todo应用的示例
Feb 20 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
VUE实现吸底按钮
Mar 04 Vue.js
Vue详细的入门笔记
May 10 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
简述php环境搭建与配置
2016/12/05 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
php生成无限栏目树
2017/03/16 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
vue模式history下在iis中配置流程
2019/04/17 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
Python 画出来六维图
2019/07/26 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
win10安装python3.6的常见问题
2020/07/01 Python
怎样写留学自荐信
2013/11/11 职场文书
项目合作计划书
2014/01/09 职场文书
工作失职检讨书范文
2014/01/16 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
奉献演讲稿范文
2014/05/21 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL