]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: more compat tweaks
authorEvan You <yyx990803@gmail.com>
Thu, 22 Apr 2021 13:49:25 +0000 (09:49 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 22 Apr 2021 13:49:25 +0000 (09:49 -0400)
packages/runtime-core/src/apiWatch.ts
packages/runtime-core/src/compat/global.ts
packages/runtime-core/src/compat/instance.ts
packages/runtime-core/src/compat/renderHelpers.ts
packages/runtime-core/src/componentOptions.ts

index b2cf45001fd6bc1d17d9401ea919f5058b419357..fa476f15dae976f3bff615a4f7c88ce645cebc2e 100644 (file)
@@ -36,6 +36,7 @@ import { queuePostRenderEffect } from './renderer'
 import { warn } from './warning'
 import { DeprecationTypes } from './compat/compatConfig'
 import { checkCompatEnabled, isCompatEnabled } from './compat/compatConfig'
+import { ObjectWatchOptionItem } from './componentOptions'
 
 export type WatchEffect = (onInvalidate: InvalidateCbRegistrator) => void
 
@@ -354,7 +355,7 @@ function doWatch(
 export function instanceWatch(
   this: ComponentInternalInstance,
   source: string | Function,
-  cb: WatchCallback,
+  value: WatchCallback | ObjectWatchOptionItem,
   options?: WatchOptions
 ): WatchStopHandle {
   const publicThis = this.proxy as any
@@ -363,6 +364,13 @@ export function instanceWatch(
       ? createPathGetter(publicThis, source)
       : () => publicThis[source]
     : source.bind(publicThis)
+  let cb
+  if (isFunction(value)) {
+    cb = value
+  } else {
+    cb = value.handler as Function
+    options = value
+  }
   return doWatch(getter, cb.bind(publicThis), options, this)
 }
 
index de89c0a90a5ae9a52513540fedc5862a2596cd37..17b71dabd2ab70c101114777b1644b4227e87d48 100644 (file)
@@ -109,6 +109,8 @@ export function createCompatVue(
   } as any
 
   const singletonApp = createApp({})
+  // @ts-ignore
+  singletonApp.prototype = singletonApp.config.globalProperties
 
   function createCompatApp(options: ComponentOptions = {}, Ctor: any) {
     assertCompatEnabled(DeprecationTypes.GLOBAL_MOUNT, null)
@@ -145,7 +147,10 @@ export function createCompatVue(
 
     // copy prototype augmentations as config.globalProperties
     if (isCompatEnabled(DeprecationTypes.GLOBAL_PROTOTYPE, null)) {
-      app.config.globalProperties = Ctor.prototype
+      app.config.globalProperties = extend(
+        Object.create(Ctor.prototype),
+        singletonApp.config.globalProperties
+      )
     }
     let hasPrototypeAugmentations = false
     for (const key in Ctor.prototype) {
index 96525a68c634abbff7228819a6b79fc93a3be9c8..1f4dec7c00d7a61d1102435078069e4b165a2fad 100644 (file)
@@ -1,4 +1,11 @@
-import { extend, NOOP, toDisplayString, toNumber } from '@vue/shared'
+import {
+  extend,
+  looseEqual,
+  looseIndexOf,
+  NOOP,
+  toDisplayString,
+  toNumber
+} from '@vue/shared'
 import { PublicPropertiesMap } from '../componentPublicInstance'
 import { getCompatChildren } from './instanceChildren'
 import {
@@ -14,13 +21,17 @@ import { compatH } from './renderFn'
 import { createCommentVNode, createTextVNode } from '../vnode'
 import { renderList } from '../helpers/renderList'
 import {
+  legacyBindDynamicKeys,
   legacyBindObjectListeners,
   legacyBindObjectProps,
   legacyCheckKeyCodes,
+  legacyMarkOnce,
+  legacyPrependModifier,
   legacyRenderSlot,
   legacyRenderStatic,
   legacyresolveScopedSlots
 } from './renderHelpers'
+import { resolveFilter } from '../helpers/resolveAssets'
 
 export function installCompatInstanceProperties(map: PublicPropertiesMap) {
   const set = (target: any, key: any, val: any) => {
@@ -85,16 +96,22 @@ export function installCompatInstanceProperties(map: PublicPropertiesMap) {
     $createElement: () => compatH,
     _self: i => i.proxy,
     _c: () => compatH,
+    _o: () => legacyMarkOnce,
     _n: () => toNumber,
     _s: () => toDisplayString,
     _l: () => renderList,
     _t: i => legacyRenderSlot.bind(null, i),
+    _q: () => looseEqual,
+    _i: () => looseIndexOf,
+    _m: i => legacyRenderStatic.bind(null, i),
+    _f: () => resolveFilter,
+    _k: i => legacyCheckKeyCodes.bind(null, i),
     _b: () => legacyBindObjectProps,
-    _e: () => createCommentVNode,
     _v: () => createTextVNode,
-    _m: i => legacyRenderStatic.bind(null, i),
-    _g: () => legacyBindObjectListeners,
+    _e: () => createCommentVNode,
     _u: () => legacyresolveScopedSlots,
-    _k: i => legacyCheckKeyCodes.bind(null, i)
+    _g: () => legacyBindObjectListeners,
+    _d: () => legacyBindDynamicKeys,
+    _p: () => legacyPrependModifier
   } as PublicPropertiesMap)
 }
index 0b90632dc9e961133d84f1d8fa222c677e55ae0d..2eaaa459fa71baa53d7f097f9557b60f721e189a 100644 (file)
@@ -162,3 +162,21 @@ function isKeyNotMatch<T>(expect: T | T[], actual: T): boolean {
     return expect !== actual
   }
 }
+
+export function legacyMarkOnce(tree: VNode) {
+  return tree
+}
+
+export function legacyBindDynamicKeys(props: any, values: any[]) {
+  for (let i = 0; i < values.length; i += 2) {
+    const key = values[i]
+    if (typeof key === 'string' && key) {
+      props[values[i]] = values[i + 1]
+    }
+  }
+  return props
+}
+
+export function legacyPrependModifier(value: any, symbol: string) {
+  return typeof value === 'string' ? symbol + value : value
+}
index 2e729bfe032131c8d3023c4bc5027f95a768e7bf..40755e80d8bc914bbd24eec07d1a8d923228bbea 100644 (file)
@@ -360,10 +360,11 @@ export type ExtractComputedReturns<T extends any> = {
     : T[key] extends (...args: any[]) => infer TReturn ? TReturn : never
 }
 
-type WatchOptionItem =
-  | string
-  | WatchCallback
-  | { handler: WatchCallback | string } & WatchOptions
+export type ObjectWatchOptionItem = {
+  handler: WatchCallback | string
+} & WatchOptions
+
+type WatchOptionItem = string | WatchCallback | ObjectWatchOptionItem
 
 type ComponentWatchOptionItem = WatchOptionItem | WatchOptionItem[]
 
@@ -949,7 +950,7 @@ function resolveData(
   }
 }
 
-function createWatcher(
+export function createWatcher(
   raw: ComponentWatchOptionItem,
   ctx: Data,
   publicThis: ComponentPublicInstance,