Skip to content

Commit 27873db

Browse files
committedMar 25, 2020
feat(runtime-core): support app.config.globalProperties
per vuejs/rfcs#117
1 parent 394fd4c commit 27873db

File tree

4 files changed

+53
-26
lines changed

4 files changed

+53
-26
lines changed
 

‎packages/runtime-core/__tests__/apiCreateApp.spec.ts

+34
Original file line numberDiff line numberDiff line change
@@ -440,4 +440,38 @@ describe('api: createApp', () => {
440440
).toHaveBeenWarned()
441441
})
442442
})
443+
444+
test('config.optionMergeStrategies', () => {
445+
let merged: string
446+
const App = defineComponent({
447+
render() {},
448+
mixins: [{ foo: 'mixin' }],
449+
extends: { foo: 'extends' },
450+
foo: 'local',
451+
beforeCreate() {
452+
merged = this.$options.foo
453+
}
454+
})
455+
456+
const app = createApp(App)
457+
app.mixin({
458+
foo: 'global'
459+
})
460+
app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
461+
462+
app.mount(nodeOps.createElement('div'))
463+
expect(merged!).toBe('global,extends,mixin,local')
464+
})
465+
466+
test('config.globalProperties', () => {
467+
const app = createApp({
468+
render() {
469+
return this.foo
470+
}
471+
})
472+
app.config.globalProperties.foo = 'hello'
473+
const root = nodeOps.createElement('div')
474+
app.mount(root)
475+
expect(serializeInner(root)).toBe('hello')
476+
})
443477
})

‎packages/runtime-core/__tests__/apiOptions.spec.ts

-22
Original file line numberDiff line numberDiff line change
@@ -563,28 +563,6 @@ describe('api: options', () => {
563563
expect(serializeInner(root)).toBe(`<div>1,1,3</div>`)
564564
})
565565

566-
test('optionMergeStrategies', () => {
567-
let merged: string
568-
const App = defineComponent({
569-
render() {},
570-
mixins: [{ foo: 'mixin' }],
571-
extends: { foo: 'extends' },
572-
foo: 'local',
573-
beforeCreate() {
574-
merged = this.$options.foo
575-
}
576-
})
577-
578-
const app = createApp(App)
579-
app.mixin({
580-
foo: 'global'
581-
})
582-
app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
583-
584-
app.mount(nodeOps.createElement('div'))
585-
expect(merged!).toBe('global,extends,mixin,local')
586-
})
587-
588566
describe('warnings', () => {
589567
mockWarn()
590568

‎packages/runtime-core/src/apiCreateApp.ts

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export interface AppConfig {
5050
devtools: boolean
5151
performance: boolean
5252
optionMergeStrategies: Record<string, OptionMergeFunction>
53+
globalProperties: Record<string, any>
5354
isCustomElement: (tag: string) => boolean
5455
errorHandler?: (
5556
err: unknown,
@@ -86,6 +87,7 @@ export function createAppContext(): AppContext {
8687
isNativeTag: NO,
8788
devtools: true,
8889
performance: false,
90+
globalProperties: {},
8991
optionMergeStrategies: {},
9092
isCustomElement: NO,
9193
errorHandler: undefined,

‎packages/runtime-core/src/componentProxy.ts

+17-4
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,15 @@ const enum AccessTypes {
7777

7878
export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
7979
get(target: ComponentInternalInstance, key: string) {
80-
const { renderContext, data, propsProxy, accessCache, type, sink } = target
80+
const {
81+
renderContext,
82+
data,
83+
propsProxy,
84+
accessCache,
85+
type,
86+
sink,
87+
appContext
88+
} = target
8189

8290
// data / props / renderContext
8391
// This getter gets called for every property access on the render context
@@ -118,19 +126,24 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
118126

119127
// public $xxx properties & user-attached properties (sink)
120128
const publicGetter = publicPropertiesMap[key]
121-
let cssModule
129+
let cssModule, globalProperties
122130
if (publicGetter) {
123131
if (__DEV__ && key === '$attrs') {
124132
markAttrsAccessed()
125133
}
126134
return publicGetter(target)
135+
} else if (hasOwn(sink, key)) {
136+
return sink[key]
127137
} else if (
128138
(cssModule = type.__cssModules) &&
129139
(cssModule = cssModule[key])
130140
) {
131141
return cssModule
132-
} else if (hasOwn(sink, key)) {
133-
return sink[key]
142+
} else if (
143+
((globalProperties = appContext.config.globalProperties),
144+
hasOwn(globalProperties, key))
145+
) {
146+
return globalProperties[key]
134147
} else if (__DEV__ && currentRenderingInstance) {
135148
warn(
136149
`Property ${JSON.stringify(key)} was accessed during render ` +

0 commit comments

Comments
 (0)