]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: warn v-if/v-for co-usage
authorEvan You <yyx990803@gmail.com>
Sat, 17 Apr 2021 18:38:30 +0000 (14:38 -0400)
committerEvan You <yyx990803@gmail.com>
Sat, 17 Apr 2021 18:38:30 +0000 (14:38 -0400)
packages/compiler-core/src/compat/compatConfig.ts
packages/compiler-core/src/parse.ts

index 712cdd9309b1e78e042a31f32c8764e510c36a39..6c54111cad2d82fcc030f36ebcbef79a165ff844 100644 (file)
@@ -81,8 +81,10 @@ const deprecationData: Record<CompilerDeprecationTypes, DeprecationData> = {
   [CompilerDeprecationTypes.COMPILER_V_IF_V_FOR_PRECEDENCE]: {
     message:
       `v-if / v-for precedence when used on the same element has changed ` +
-      `in Vue 3. It is best to avoid the ambiguity with either <template> tags ` +
-      `or a computed property that filters v-for data source.`,
+      `in Vue 3: v-if now takes higher precedence and will no longer have ` +
+      `access to v-for scope variables. It is best to avoid the ambiguity ` +
+      `with <template> tags or use a computed property that filters v-for ` +
+      `data source.`,
     link: `https://v3.vuejs.org/guide/migration/v-if-v-for.html`
   },
 
index 1e7d97012bf46a69b0606f6dc400df87a96c42e7..9db216f169ca7a6a4fe571ed979a60f3b8f0d131 100644 (file)
@@ -33,7 +33,8 @@ import {
 import {
   checkCompatEnabled,
   CompilerCompatOptions,
-  CompilerDeprecationTypes
+  CompilerDeprecationTypes,
+  warnDeprecation
 } from './compat/compatConfig'
 
 type OptionalOptions =
@@ -488,6 +489,29 @@ function parseTag(
     props = parseAttributes(context, type).filter(p => p.name !== 'v-pre')
   }
 
+  // warn v-if/v-for usage on the same element
+  if (__COMPAT__ && __DEV__ && !__TEST__) {
+    let hasIf = false
+    let hasFor = false
+    for (let i = 0; i < props.length; i++) {
+      const p = props[i]
+      if (p.type === NodeTypes.DIRECTIVE) {
+        if (p.name === 'if') {
+          hasIf = true
+        } else if (p.name === 'for') {
+          hasFor = true
+        }
+      }
+      if (hasIf && hasFor) {
+        warnDeprecation(
+          CompilerDeprecationTypes.COMPILER_V_IF_V_FOR_PRECEDENCE,
+          context,
+          getSelection(context, start)
+        )
+      }
+    }
+  }
+
   // Tag close.
   let isSelfClosing = false
   if (context.source.length === 0) {