首页前端开发JavaScript详解为什么Vue中的v-if和v-for不建议一起用

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

时间2024-01-31 14:24:02发布访客分类JavaScript浏览244
导读:收集整理的这篇文章主要介绍了详解为什么Vue中的v-if和v-for不建议一起用,觉得挺不错的,现在分享给大家,也给大家做个参考。 本文主要介绍了为什么v-if和v-for不建议一起用?...
收集整理的这篇文章主要介绍了详解为什么Vue中的v-if和v-for不建议一起用,觉得挺不错的,现在分享给大家,也给大家做个参考。

本文主要介绍了为什么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不建议一起用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • vue2和vue3的v-if与v-for优先级对比学习
  • 浅谈v-for 和 v-if 并用时筛选条件方法
  • vue的注意规范之v-if 与 v-for 一起使用教程
  • 详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
  • 解决v-for中使用v-if或者v-bind:class失效的问题
  • 对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
  • Vue.js常用指令汇总(v-if、v-for等)

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: 基于VUE实现简单的学生信息管理系...下一篇:vue自定义组件实现双向绑定猜你在找的JavaScript相关文章 html font标签如何设置字体大小?html font标签属性用法介绍2022-05-16vue3+TypeScript+vue-router的使用方法2022-04-16vue3获取当前路由地址2022-04-16如何利用React实现图片识别App2022-04-16JavaScript展开运算符和剩余运算符的区别详解2022-04-16微信小程序中使用vant框架的具体步骤2022-04-16Vue elementUI表单嵌套表格并对每行进行校验详解2022-04-16如何利用Typescript封装本地存储2022-04-16微信小程序中wxs文件的一些妙用分享2022-04-16JavaScript的Set数据结构详解2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: 详解为什么Vue中的v-if和v-for不建议一起用
本文地址: https://pptw.com/jishu/594076.html
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能 指针和引用的不同点与相同点分别是什么

游客 回复需填写必要信息