فهرست منبع

fix(compiler-sfc): treat const reactive() bindings as mutable

Evan You 5 سال پیش
والد
کامیت
03360cefa1
2فایلهای تغییر یافته به همراه7 افزوده شده و 4 حذف شده
  1. 1 1
      packages/compiler-core/src/transforms/vFor.ts
  2. 6 3
      packages/compiler-sfc/src/compileScript.ts

+ 1 - 1
packages/compiler-core/src/transforms/vFor.ts

@@ -79,7 +79,7 @@ export const transformFor = createStructuralDirectiveTransform(
 
       const isStableFragment =
         forNode.source.type === NodeTypes.SIMPLE_EXPRESSION &&
-        forNode.source.constType > ConstantTypes.CAN_SKIP_PATCH
+        forNode.source.constType > ConstantTypes.NOT_CONSTANT
       const fragmentFlag = isStableFragment
         ? PatchFlags.STABLE_FRAGMENT
         : keyProp

+ 6 - 3
packages/compiler-sfc/src/compileScript.ts

@@ -1036,12 +1036,15 @@ function walkDeclaration(
       )
       if (id.type === 'Identifier') {
         let bindingType
-        if (
+        const userReactiveBinding = userImportAlias['reactive'] || 'reactive'
+        if (isCallOf(init, userReactiveBinding)) {
+          // treat reactive() calls as let since it's meant to be mutable
+          bindingType = BindingTypes.SETUP_LET
+        } else if (
           // if a declaration is a const literal, we can mark it so that
           // the generated render fn code doesn't need to unref() it
           isDefineCall ||
-          (isConst &&
-            canNeverBeRef(init!, userImportAlias['reactive'] || 'reactive'))
+          (isConst && canNeverBeRef(init!, userReactiveBinding))
         ) {
           bindingType = BindingTypes.SETUP_CONST
         } else if (isConst) {