首页前端开发其他前端知识vue中v-if与v-for的优先级哪个更高?

vue中v-if与v-for的优先级哪个更高?

时间2024-03-25 07:36:03发布访客分类其他前端知识浏览391
导读:在这篇文章中我们会学习到关于“vue中v-if与v-for的优先级哪个更高?”的知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望对大家学习或工作能有帮助。下面就请大家跟着小编的思路一起来学习一下吧。...
在这篇文章中我们会学习到关于“vue中v-if与v-for的优先级哪个更高?”的知识,小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望对大家学习或工作能有帮助。下面就请大家跟着小编的思路一起来学习一下吧。


在vue2中,v-for的优先级高于v-if;在vue3中,v-if的优先级高于v-for。在vue中,永远不要把v-if和v-for同时用在同一个元素上,会带来性能方面的浪费(每次渲染都会先循环再进行条件判断);想要避免出现这种情况,可在外层嵌套template(页面渲染不生成dom节点),在这一层进行v-if判断,然后在内部进行v-for循环。

如何快速入门VUE3.0:进入学习

本教程操作环境:windows7系统、vue3版,DELL G3电脑。

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>
    

优先级

其实在vue2和vue3中的答案是截然相反的。

  • 在vue2中,v-for的优先级高于v-if

  • 在vue3中,v-if的优先级高于v-for

vue2中的v-for和v-if

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
    }

  }

}
)
ƒ 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作用在不同标签时候,是先进行判断,再进行列表的渲染。

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高。

vue3中的v-for和v-if

在vue3中,v-if的优先级高于v-fo,所以v-if执行时,它调用的变量还不存在,就会导致异常

说明:通常有两种情况下导致我们这样做:

1.为了过滤列表中的项目,比如:

v-for="user in users" v-if="user.isActive"
  • 在vue2中,把它们放在一起,输出的渲染函数中可以看出会先执行循环再判断条件,哪怕我们只渲染列表中一小部分元素,也得在每次重渲染的时候遍历整个列表,这会比较浪费
  • 在vue3中,v-if的优先级高于v-fo,所以v-if执行时,它调用的变量还不存在,就会导致异常

此时定义一个计算属性(比如 activeUsers),让其返回过滤后的列表即可(比如users.filter(u=> u.isActive))。

2.为了避免渲染本应该被隐藏的列表

v-for="user in users" v-if="shouldShowUsers"
  • 同样,在vue2中,把它们放在一起,输出的渲染函数中可以看出会先执行循环再判断条件,哪怕我们只渲染列表中一小部分元素,也得在每次重渲染的时候遍历整个列表,这会比较浪费
  • 在vue3中,这样写虽然并不会报错,但是官方还是及其不推荐外面这样去做

此时把v-if移动至容器元素上(比如ulol)或者外面包一层template即可。

注意事项

永远不要把 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
      }
)
    }

}
    

以上就是关于vue中v-if与v-for的优先级哪个更高?的介绍,本文内容仅供参考,有需要的朋友可以借鉴了解看看,希望对大家学习或工作,想要了解更多欢迎关注网络,小编每天都会为大家更新不同的知识。

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

v-forVuevue.js

若转载请注明出处: vue中v-if与v-for的优先级哪个更高?
本文地址: https://pptw.com/jishu/652633.html
PHP中字符串排序和比较对象怎样做 vue-roter的模式有哪些种?

游客 回复需填写必要信息