From bf1fbe997d47c72058ea38097b96f02abae3e1b3 Mon Sep 17 00:00:00 2001 From: ced Date: Mon, 14 Nov 2022 16:56:31 +0100 Subject: [PATCH] fix: expose props on vm for script setup components Fixes #1863 It turns out `vm` is not enough, and we need to proxy to `vm.$.ctx` which contains the props as well. --- src/vueWrapper.ts | 4 +++- tests/components/ScriptSetupWithProps.vue | 13 +++++++++++++ tests/expose.spec.ts | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/components/ScriptSetupWithProps.vue diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index 5034a4405..6995c7d66 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -35,7 +35,9 @@ function createVMProxy( if (key in setupState) { return Reflect.get(setupState, key, receiver) } else { - return (vm as any)[key] + // vm.$.ctx is the internal context of the vm + // with all variables, methods and props + return (vm as any).$.ctx[key] } }, set(vm, key, value, receiver) { diff --git a/tests/components/ScriptSetupWithProps.vue b/tests/components/ScriptSetupWithProps.vue new file mode 100644 index 000000000..8a2b1c09f --- /dev/null +++ b/tests/components/ScriptSetupWithProps.vue @@ -0,0 +1,13 @@ + + + diff --git a/tests/expose.spec.ts b/tests/expose.spec.ts index 7ff5528ef..16364149d 100644 --- a/tests/expose.spec.ts +++ b/tests/expose.spec.ts @@ -6,6 +6,7 @@ import DefineExpose from './components/DefineExpose.vue' import DefineExposeWithRenderFunction from './components/DefineExposeWithRenderFunction.vue' import ScriptSetupExpose from './components/ScriptSetup_Expose.vue' import ScriptSetup from './components/ScriptSetup.vue' +import ScriptSetupWithProps from './components/ScriptSetupWithProps.vue' describe('expose', () => { it('access vm on simple components', async () => { @@ -76,4 +77,18 @@ describe('expose', () => { expect(spiedIncrement).toHaveBeenCalled() expect(wrapper.html()).toContain('0') }) + + it('access props on vm with