]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(runtime-core): support app.config.globalProperties
authorEvan You <yyx990803@gmail.com>
Wed, 25 Mar 2020 13:28:37 +0000 (09:28 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 25 Mar 2020 13:28:43 +0000 (09:28 -0400)
per https://github.com/vuejs/rfcs/pull/117/

packages/runtime-core/__tests__/apiCreateApp.spec.ts
packages/runtime-core/__tests__/apiOptions.spec.ts
packages/runtime-core/src/apiCreateApp.ts
packages/runtime-core/src/componentProxy.ts

index d43b660d9e70fccdbedc87456429643f1c32bf2c..fbc784f44d4e2d0339e9da3339f11893b60ead32 100644 (file)
@@ -440,4 +440,38 @@ describe('api: createApp', () => {
       ).toHaveBeenWarned()
     })
   })
+
+  test('config.optionMergeStrategies', () => {
+    let merged: string
+    const App = defineComponent({
+      render() {},
+      mixins: [{ foo: 'mixin' }],
+      extends: { foo: 'extends' },
+      foo: 'local',
+      beforeCreate() {
+        merged = this.$options.foo
+      }
+    })
+
+    const app = createApp(App)
+    app.mixin({
+      foo: 'global'
+    })
+    app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
+
+    app.mount(nodeOps.createElement('div'))
+    expect(merged!).toBe('global,extends,mixin,local')
+  })
+
+  test('config.globalProperties', () => {
+    const app = createApp({
+      render() {
+        return this.foo
+      }
+    })
+    app.config.globalProperties.foo = 'hello'
+    const root = nodeOps.createElement('div')
+    app.mount(root)
+    expect(serializeInner(root)).toBe('hello')
+  })
 })
index 379d15db45eb101c0868973c7d08003c8024ba93..3a34c966a6db0992e41651c21e0683b506609614 100644 (file)
@@ -563,28 +563,6 @@ describe('api: options', () => {
     expect(serializeInner(root)).toBe(`<div>1,1,3</div>`)
   })
 
-  test('optionMergeStrategies', () => {
-    let merged: string
-    const App = defineComponent({
-      render() {},
-      mixins: [{ foo: 'mixin' }],
-      extends: { foo: 'extends' },
-      foo: 'local',
-      beforeCreate() {
-        merged = this.$options.foo
-      }
-    })
-
-    const app = createApp(App)
-    app.mixin({
-      foo: 'global'
-    })
-    app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
-
-    app.mount(nodeOps.createElement('div'))
-    expect(merged!).toBe('global,extends,mixin,local')
-  })
-
   describe('warnings', () => {
     mockWarn()
 
index 7c63f0b0deaf5a38c6fc759283757b50f52884a1..2f76d6b4ec396092fd3fbb1cbb0d7af38be4ef21 100644 (file)
@@ -50,6 +50,7 @@ export interface AppConfig {
   devtools: boolean
   performance: boolean
   optionMergeStrategies: Record<string, OptionMergeFunction>
+  globalProperties: Record<string, any>
   isCustomElement: (tag: string) => boolean
   errorHandler?: (
     err: unknown,
@@ -86,6 +87,7 @@ export function createAppContext(): AppContext {
       isNativeTag: NO,
       devtools: true,
       performance: false,
+      globalProperties: {},
       optionMergeStrategies: {},
       isCustomElement: NO,
       errorHandler: undefined,
index e40fb8019de3062e9088367ba4d0ae38768f6a8d..ce2261d7abbaca7770f09ffbc722510ad33296ca 100644 (file)
@@ -77,7 +77,15 @@ const enum AccessTypes {
 
 export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
   get(target: ComponentInternalInstance, key: string) {
-    const { renderContext, data, propsProxy, accessCache, type, sink } = target
+    const {
+      renderContext,
+      data,
+      propsProxy,
+      accessCache,
+      type,
+      sink,
+      appContext
+    } = target
 
     // data / props / renderContext
     // This getter gets called for every property access on the render context
@@ -118,19 +126,24 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
 
     // public $xxx properties & user-attached properties (sink)
     const publicGetter = publicPropertiesMap[key]
-    let cssModule
+    let cssModule, globalProperties
     if (publicGetter) {
       if (__DEV__ && key === '$attrs') {
         markAttrsAccessed()
       }
       return publicGetter(target)
+    } else if (hasOwn(sink, key)) {
+      return sink[key]
     } else if (
       (cssModule = type.__cssModules) &&
       (cssModule = cssModule[key])
     ) {
       return cssModule
-    } else if (hasOwn(sink, key)) {
-      return sink[key]
+    } else if (
+      ((globalProperties = appContext.config.globalProperties),
+      hasOwn(globalProperties, key))
+    ) {
+      return globalProperties[key]
     } else if (__DEV__ && currentRenderingInstance) {
       warn(
         `Property ${JSON.stringify(key)} was accessed during render ` +