From 232d14c0dd6db817681620c4ba881ca016551bd2 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 19 Sep 2018 23:43:27 -0400 Subject: [PATCH] test: basic 2.x compat test case --- packages/core/src/componentUtils.ts | 5 +++++ packages/vue/__tests__/compat.spec.ts | 32 +++++++++++++++++++++++++++ packages/vue/src/index.ts | 6 +++-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 packages/vue/__tests__/compat.spec.ts diff --git a/packages/core/src/componentUtils.ts b/packages/core/src/componentUtils.ts index 6ef7c27c..0a409119 100644 --- a/packages/core/src/componentUtils.ts +++ b/packages/core/src/componentUtils.ts @@ -183,6 +183,11 @@ export function createComponentClassFromOptions( set: isGet ? undefined : value.set }) } + if (key === 'methods') { + for (const method in value) { + ;(ObjectComponent.prototype as any)[method] = value[method] + } + } } return ObjectComponent as ComponentClass } diff --git a/packages/vue/__tests__/compat.spec.ts b/packages/vue/__tests__/compat.spec.ts new file mode 100644 index 00000000..b1aa63c2 --- /dev/null +++ b/packages/vue/__tests__/compat.spec.ts @@ -0,0 +1,32 @@ +;(global as any).__COMPAT__ = true + +import Vue from '../src/index' + +describe('2.x compat build', async () => { + test('should work', async () => { + const root = document.createElement('div') + document.body.appendChild(root) + + const instance = new Vue({ + data() { + return { count: 0 } + }, + methods: { + change() { + this.count++ + } + }, + render(h: any) { + return h('div', this.count) + } + }).$mount(root) + + expect(instance.count).toBe(0) + expect(root.textContent).toBe('0') + + instance.change() + expect(instance.count).toBe(1) + await Vue.nextTick() + expect(root.textContent).toBe('1') + }) +}) diff --git a/packages/vue/src/index.ts b/packages/vue/src/index.ts index a29912cb..437f31a5 100644 --- a/packages/vue/src/index.ts +++ b/packages/vue/src/index.ts @@ -1,6 +1,7 @@ import { h, render, + nextTick, Component, ComponentOptions, createComponentInstance @@ -9,8 +10,9 @@ import { class Vue extends Component { static h = h static render = render + static nextTick = nextTick - constructor(options: ComponentOptions & { el: any }) { + constructor(options: ComponentOptions & { el?: any }) { super() if (!options) { return @@ -21,7 +23,7 @@ class Vue extends Component { vnode.children = instance function mount(el: any) { - const dom = document.querySelector(el) + const dom = typeof el === 'string' ? document.querySelector(el) : el render(vnode, dom) return instance.$proxy }