zoukankan      html  css  js  c++  java
  • v-if和v-for 那个优先级最高?如果两个同事出现,应该怎么优化到更好的性能?

    测试如下:

    <body>
      <div id="app">
        {{message}}
        <ul>
          <li v-for="item in list" v-if="item.state === 0">{{item.name}}</li>
        </ul>
          
        <ul v-if="isShow">
          <li v-for="item in list">{{item.name}}</li>
        </ul>
      </div>
      <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
      <script>
          const vm = new Vue({
            el: '#app',
            data: {
              message: 'Hello World',
              isShow: false,
              list: [
                { id: 0, name: '小李', state: 0 },
                { id: 1, name: '小红', state: 0 },
                { id: 2, name: '小王', state: 1 },
                { id: 3, name: '小张', state: 0 }
              ]
            }
          })
      </script>
    </body>
    
    • 两者同级时的render函数

      (function() {
          with(this){
              return _c('div',
                        {attrs:{"id":"app"}},
                        [_v("
          "+_s(message)+"
          "),
                         _c('ul',_l((list),function(item){ // _l 列表渲染方法
                             return (item.state === 0)?_c('li',[_v(_s(item.name))]):_e()}),0)])
          }
      })
      
      
      

      当两者放在一起,(item.state === 0) 一定是在内部,我们可以看出_l 循环是在外面先执行,

    • 两者不同级渲染函数如下:

      (function() {
          with(this){
              return _c(
                  'div',
                  {
                      attrs:{
                          "id":"app"
                      }
                  },
                  [
                      _v("
          "+_s(message)+"
          "),
                      _v(" "),(isShow)
                      ?
                      _c('ul',_l((list), function(item){
                          return _c('li',[_v(_s(item.name))])
                      }),0)
                      :_e()
                  ]
              )
          }
      })
      

      两者不同级时,isShow _l 渲染函数外部

    我们来看看源码的实现:vue/src/compiler/codegen/index.js

    结论:

    1. 显然 v-for优先级高于v-if;
    2. 两者同级出现,每次渲染都会先执行循环再判断条件,无论如何循环都不可避免的浪费性能;
    3. 避免出现这种情况,可在外层嵌套一层进行v-if判断,然后在内部进行v-for循环;
    4. 如果条件出现在循环内部,可通过计算属性提前过滤掉那些不需要显示的项,减少dom操作;

    注意:官方不推荐在同一元素上使用 v-ifv-for

  • 相关阅读:
    java 集合排序
    java传值和传址
    Dom4j操作xml
    JAXP操作xml
    乐观锁和悲观锁【转】
    java IO【转】
    java 可变参数
    Eclipse调试Java的10个技巧【转】
    编译JDK源代码【转】
    Access restriction: The method typeNameToClass(String) from the type ObjectHandler is not accessible due to restriction on required library
  • 原文地址:https://www.cnblogs.com/wangyong1997/p/14434776.html
Copyright © 2011-2022 走看看