在vue2中应尽量避免二者同时使用

vue 2.x官方链接

v-ifv-for 一起使用时,v-for 具有比 v-if 更高的优先级。

那么,我们举个例子说明为啥不推荐

<template>
  <div class="hello">
     <div  v-for="(item,index) in list" v-if="index === 9" :key="item" ></div>
  </div>
</template>
​
<script>
export default {
  data(){
    return {
      list:[1,2,3,4,5,6,7,8,9,10]   //需要遍历的数据
    }
  }
};
</script>
​
<style scoped>
</style>

它实际经过的运算是这样的

this.list.map(function (item,index) {
  if (index===9) {
    return item
  }
})

因此哪怕我们只渲染出一小部分的元素,也得在每次重渲染的时候遍历整个列表,不论是否发生了变化。

不建议这样做的原因就是比较浪费性能

Vue2 推荐的改进方案也是比较简单,就是采用计算属性去生成你要遍历的数组

如下

<template>
  <div class="hello">
    <!-- 2. 然后这里去循环已经被过滤的属性 -->
     <div  v-for="(item) in ListArr" :key="item" ></div>
  </div>
</template>
​
<script>
export default {
  data(){
    return {
      list:[1,2,3,4,5,6,7,8,9,10]
    }
  },
  computed:{
    //1. 在computed里先做好判断,这里过滤的成本远比v-if的成本低
    ListArr(){
        return this.list.filter((_,index) => index === 1)
    }
  }
};
</script>
<style scoped>
</style>

从计算成本上来说,在计算属性中过滤会比在dom中判断是否显示更低。

vue3中的改变

vue 3.x官方文档

v-ifv-for 一起使用时,v-if 具有比 v-for 更高的优先级。

那么是不是就可以鼓励大家这样使用呢?很显然不是,官方文档仍然不推荐同时使用,我们看下为什么

同样的,我们仍然使用上面例子做分析

<template>
  <div class="hello">
     <div  v-for="(item,index) in list" v-if="index === 9" :key="item" ></div>
  </div>
</template>
​
<script>
export default {
  data(){
    return {
      list:[1,2,3,4,5,6,7,8,9,10]   //需要遍历的数据
    }
  }
};
</script>
<style scoped>
</style>

由于 v-if 优先级高,导致页面什么也不会渲染,控制台还有报错

[Vue warn]: Property "index" was accessed during render but is not defined on instance.

当然还有一些其它用法例如这种,可以显示数据,只是会一些Vue warn的警告

<template>
  <div class="hello">
     <ul>
        <li v-for="(item, index) in list" :key="index" v-if="item.show">
          {{ item.name }}
        </li>
      </ul>
  </div>
</template>
​
<script>
export default {
  data(){
    return {
      list:[
       { name: '张三', show: false },
       { name: '李四', show: true },
      ]   //需要遍历的数据
    }
  }
};
</script>
<style scoped>
</style>

这种方法也不是最好的,官方推荐的写法是这样的, 把 v-for 移动到容器元素上,例如ul,ol 或者外面包裹一层 template

<template>
  <div class="hello">
     <ul>
         <template v-for="(item, index) in list" :key="index">
          <li v-if="item.show">
            {{ item.name }}
          </li>
        </template>
      </ul>
  </div>
</template>
​
<script>
export default {
  data(){
    return {
      list:[
       { name: '张三', show: false },
       { name: '李四', show: true },
      ]   //需要遍历的数据
    }
  }
};
</script>
<style scoped>
</style>

但如果想要有条件地跳过循环的执行,那么可以将v-if置于外层元素或者template上。

例如这样

<template>
  <div class="hello">
     <ul v-if="list.length">
          <li v-for="(item, index) in list" :key="index">
            {{ item.name }}
          </li>
      </ul>
  </div>
</template>
​
<script>
export default {
  data(){
    return {
      list:[
       { name: '张三', show: false },
       { name: '李四', show: true },
      ]   //需要遍历的数据
    }
  }
};
</script>
<style scoped>
</style>

结论

  • 在vue2中,v-for的优先级高于v-if
  • 在vue3中,v-if的优先级高于v-for
  • 两种混在一起写法均不被官方推荐

补充:注意事项

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

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

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

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

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

总结

到此这篇关于Vue3中v-if和v-for优先级详解的文章就介绍到这了,更多相关Vue3 v-if和v-for优先级内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Vue3中v-if和v-for优先级实例详解的更多相关文章

  1. iOS推送通知优先级

    我已设置推送通知并正常工作,但是,有时我会遇到终端设备上的延迟交付.有没有办法我可以将推送的“优先级”键设置为10,以便立即发送推送?

  2. ios – 何时使用Semaphore而不是Dispatch Group?

    我会假设我知道如何使用DispatchGroup,为了解问题,我尝试过:结果–预期–是:为了使用信号量,我实现了:并在viewDidLoad方法中调用它.结果是:从概念上讲,dispachGroup和Semaphore都有同样的目的.老实说,我不熟悉:什么时候使用信号量,尤其是在与dispachGroup合作时–可能–处理问题.我错过了什么部分?

  3. 如何使用Xcode的自动布局调整视图大小

    解决方法在写这个问题时,我意识到了诀窍是什么:在NSPopUpButton的大小检查器中,我不得不降低内容拥抱优先级.显然,这可以控制视图“拥抱”其内容的紧密程度.因此,当拥抱优先级高于调整大小优先级时,视图将不希望增加其大小,因为这意味着其边界与其内容之间具有更多的空白空间.然后在我的特殊情况下,我也可以将两个NSPopUpButtons固定为具有相同的宽度和vo:popUpButtons将完美地调整大小,同时保持间距不变.

  4. ios – 默认的自动布局内容拥抱和内容压缩阻抗优先级值是什么?

    我正在尝试调试自动布局问题,并且知道内容拥抱和内容压缩阻力优先级的默认值将有所帮助.这些是什么?它们是否特定于特定组件?我可以使用常量来引用它们吗?

  5. ios – 为自定义创建的串行异步队列设置优先级

    如何使用GCD为自定义创建的串行异步队列设置高优先级?如果是这样,什么是替代解决方案?解决方法您的队列仍然是串行的.它只会在高优先级全局并发后台队列的一个插槽中一次执行一项任务.一旦创建,串行队列就不能以任何方式“并发”.同样,如果您创建并发队列并将其设置为以串行队列为目标,则它实际上变为串行.这一切都在manpage中有所涉及.

  6. iOS 9中UILabel中的多行文本

    我正在开发iOS项目但是当我更新到iOS9时,我在UILabels中遇到了多线问题.我正在使用Autolayout.有谁知道如何在iOS9中做到这一点?如果是这样,那么问题可能是标签内容压缩阻力优先级太低,尝试将其设置为required或1000.内容压缩阻力告诉视图引擎您的标签可以缩小的优先级.将其设置为必需会强制它不缩小.在InterfaceBuilder中,只需选择标签,点击SizeInspector(小标尺),然后将其更改为1000.或者,在代码中,等价物将是:

  7. ios – AutoLayout修改约束

    我发现Autolayout有点困难,所以任何帮助都会非常感激解决方法嗨,你可以做2套约束:>1以优先级高管理您的四视图>1以优先级低管理全屏在点击按钮时调用的方法中,将优先级设置为全屏约束,将优先级设置为四视图约束.

  8. Swift 运算符重载

    但是现在还有另外一个Swift的特性,你应该知道并且会爱上它,它就是运算符重载。例如:我们在SwiftSpriteKitutilitylibrary代码中使用运算符重载去讲多个CGPoints对象相加,例如下面代码:1234letpt1=CGPointletpt2=CGPointletpt3=pt1+pt2letpt4=pt3*100方便吧?当一个人查看你的代码,他们希望操作符的默认行为,这时候运算符重载会使他们迷惑。幸运的是Swift让你能够定义属于你自己的自定义的运算符。

  9. Swift学习一:自定义运算符 operator

    自定义运算符仅能包含这些字符:运算符位置:运算符其他配置范例

  10. [翻译]Swift编程语言——高级操作符

    高级操作符在前面的基本操作符之外,为了做更复杂的值操作,Swift还提供了若干高级操作符。不同于C中的算术操作符,Swfit中的算术操作符不会默认溢出。Swift使得为这些自定义的类型量身打造标准操作符的实现变得很轻松。预定义操作符没有任何限制,Swift提供了定制中缀、前缀、后缀和指派操作符的自由。Swfit提供所有的C支持的按位操作符,下文有具体描述。CSS颜色值#CC6699依据Swift的十六进制表示法被写作0xCC6699。)有符号整型用它们的第一个bit来表示正负。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部