vue3跟vue2,v-if跟v-for同时使用区别,附源码文件位置

vue2 版本

v-if与v-for同时使用,v-for优先级最高。为什么?因为源码这么写。。
先遍历,在判断,有些不显示的节点遍历时不必要的,浪费性能。不建议同时使用。

vue2.6.14 源码位置 vue\src\compiler\codegen\index.js

在56行 genElement函数内

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 {
  ...
  }
  }

vue3 版本

在此版本调整了优先级,v-if 比v-for优先级高
开发者为了防止我们同时使用两个指令产生性能问题

vue3.3.4 源码位置 core\packages\compiler-core\src\compile.ts

在27行 getBaseTransformPreset函数内

export function getBaseTransformPreset(
  prefixIdentifiers?: boolean
): TransformPreset {
  return [
    [ //transformif同时使用,性能问题,先判断if
      transformOnce,
      transformIf,
      transformMemo,
      transformFor,

      ...(__COMPAT__ ? [transformFilter] : []),
      ...(!__BROWSER__ && prefixIdentifiers
        ? [
            // order is important
            trackVForSlotScopes,
            transformExpression
          ]
        : __BROWSER__ && __DEV__
        ? [transformExpression]
        : []),
      transformSlotOutlet,
      transformElement,
      trackSlotScopes,
      transformText
    ],
    {
      on: transformOn,
      bind: transformBind,
      model: transformModel
    }
  ]
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值