v-if 和 v-for 为什么不建议一起用?(看完秒懂不纠结)-程序员宅基地

技术标签: 前端框架  前端  es6  vue.js  小程序  javascript  jquery  

在这里插入图片描述



一、作用

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-ifv-for都是vue模板系统中的指令

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

示例

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

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

创建vue实例,存放isShowitems数据

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) }
}

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

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

再将v-forv-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-forv-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-ifv-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
      })
    }
}

希望本文能够对您有所帮助!如果您有任何问题或建议,请随时在评论区留言联系 章挨踢(章IT)
谢谢阅读!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_69422396/article/details/135217505

智能推荐

Luban 鲁班 图片压缩 MD-程序员宅基地

文章浏览阅读173次。Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 [email protected] 鲁班 图片压缩目录目录介绍turbo 版本算法步骤使用..._luban图片压缩

DC电源模块的 PCB设计和布局指南_dc电源连接器pcb-程序员宅基地

文章浏览阅读349次,点赞3次,收藏7次。4. 信号和电源之间的隔离:为了避免信号和电源之间的互相干扰,应该合理布局信号和电源线路。1. 选择合适的PCB尺寸和层数:根据电源模块的尺寸和功能需求,选择合适的PCB尺寸和层数。DC电源模块的PCB设计和布局是一个关键的步骤,它直接影响到电源的性能和稳定性。9. PCB堆叠和布线规则:遵循PCB堆叠和布线的规则,如避免交叉布线、减小导线长度、保持信号和地线平行等,以减少干扰和串扰。7. 输入和输出保护:为了保护电源模块和外部设备,可以在输入和输出端添加适当的保护电路,如过压保护、过流保护、短路保护等。_dc电源连接器pcb

题解_翻转字符串中各单词的字母顺序_翻转字符串中每个单词的字符顺序-程序员宅基地

文章浏览阅读434次。文章目录一、题目描述二、解决思路三、主要方法四、源代码五、运行结果一、题目描述编写一个方法,将一段文本中的各个单词的字母顺序翻转样例输入:“I like writing code best”样例输出:“I ekil gnitirw edoc tseb”二、解决思路1 将空格作为分隔符分割字符串,得到字符串数组2 倒序遍历字符串数组,将每个字符串加入StringBuilder字符串中3 翻转StringBuilder字符串三、主要方法public String[] split​(Str_翻转字符串中每个单词的字符顺序

探索 ProcInfo:强大的MacOS进程信息工具-程序员宅基地

文章浏览阅读217次,点赞3次,收藏4次。探索 ProcInfo:强大的MacOS进程信息工具项目地址:https://gitcode.com/objective-see/ProcInfo在软件开发和系统管理员的世界中,了解系统的运行状态至关重要。对于 macOS 用户,我们有了一个名为 ProcInfo 的强大工具,它提供了一种直观且全面的方式来查看和监控你的操作系统中的进程信息。项目简介ProcInfo 是一个免费、开源的应...

探索React Native:Wix Incubator的Crash Course项目深度解析-程序员宅基地

文章浏览阅读670次,点赞8次,收藏11次。探索React Native:Wix Incubator的Crash Course项目深度解析项目地址:https://gitcode.com/wix-incubator/react-native-crash-course在现代移动应用开发中,React Native是一个备受开发者喜爱的技术框架。它允许您使用JavaScript和React库构建原生iOS和Android应用。为了帮助新手...

基于Java学生成绩管理系统设计与实现(源码+部署文档+报告)_基于java的学生成绩管理系统的设计与实现-程序员宅基地

文章浏览阅读1k次,点赞20次,收藏22次。采用servlet+jsp+jdbc+mysql的技术以及mvc模式进行项目开发,本次开发的内容主要以实现CRUD核心功能为主的学生成绩管理系统,前端采用jquery+javascript+jstl进行数据传输以及处理,bootstrap写界面。_基于java的学生成绩管理系统的设计与实现

随便推点

Docker安装以及修改Docker的默认存储路径_部署docker环境脚本(需指定docker存储路径)-程序员宅基地

文章浏览阅读4.9k次。文章目录1. Docker安装1.1 使用官方安装脚本自动安装1.2 建立 docker 用户组1.3 卸载 docker1. Docker安装1.1 使用官方安装脚本自动安装curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun或者curl -sSL https://get.daocloud.io/docker | sh其他安装方法:https://www.runoob.com/docker/ubuntu-do_部署docker环境脚本(需指定docker存储路径)

PostgreSQL JDBC 源码分析之fetchSize-程序员宅基地

文章浏览阅读6.5k次,点赞5次,收藏16次。JDBC的statement对象,有一个setFetchSize方法,参数是一个int值,其作用是,执行查询时,一次从服务器端拿多少行的数据到本地jdbc客户端这里来还有一个方法:setMaxRows,这个方法,作用是JDBC最多返回多少行数据给调用者。举个例子:一个表,有100行数据,sql语句为select * from table,fetchsize设置为20,maxrows设置为5

四种方法给Vmware虚拟机清理瘦身_hypver-v 清理磁盘大小-程序员宅基地

文章浏览阅读5w次,点赞23次,收藏89次。随着VMware虚拟机使用时间的增长,其所占用的空间也越来越大,本文来说说怎么给VMware虚拟机占用的空间进行瘦身。方法一:VMware自带的清理磁盘这个方法是VMware自带,具有普适性,对快照等文件不造成影响。步骤如下:1、将要清理的虚拟机关机。2、右键该虚拟机——>管理——>清理磁盘,VMware会自动提示可清理的磁盘大小,点击确定等待清理完毕即可。方法二:VMwa..._hypver-v 清理磁盘大小

spark的应用场景和基本原理_spark在生活中的应用场景及工作原理-程序员宅基地

文章浏览阅读7.1k次。摘要:spark的优势:(1)图计算,迭代计算(训练机器学习算法模型做广告推荐,点击预测,同时基于spark的预测模型能做到分钟级)(2)交互式查询计算(实时)spark的主要应用场景:(1)推荐系统,实时推荐 (2)交互式实时查询spark特点:(1)分布式并行计算框架(2)内存计算,不仅数据加载到内存,中间结果也存储内存(中间结果不需要落地到hdfs)还有一个特点:Spark在_spark在生活中的应用场景及工作原理

python 三次根号_开3次方根(多次方根)的代码:二分法,python-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏8次。基本问题:给出n值,求其对应的三次方根的值(该问题可以扩展到多次方根的值) 解决思路:该问题的解决思路可以有两个:1)类比于在一堆数列里找某一个符合条件的值x,条件为:,可想而知,最常用的搜索方法为二分法。 其基本思路为:假设n=7step1: 7/2=3.5;=42.875>7; step2: 3.5/2= 1.75;=5.359<7; step3: (1.75+3.5)/2=2.6..._用不同迭代格式求的根,并研究不同迭代格式根号三python,

Linux sysctl命令查看内核参数_sysctl 查看配置-程序员宅基地

文章浏览阅读553次。sysctl命令_sysctl 查看配置