diff --git a/src/createInstance.ts b/src/createInstance.ts index c88d8bc93..c682ff59f 100644 --- a/src/createInstance.ts +++ b/src/createInstance.ts @@ -9,7 +9,8 @@ import { ComponentOptions, ConcreteComponent, DefineComponent, - transformVNodeArgs + transformVNodeArgs, + proxyRefs } from 'vue' import { MountingOptions, Slot } from './types' @@ -20,6 +21,7 @@ import { isObject, isObjectComponent, isScriptSetup, + mergeDeep, mergeGlobalProperties } from './utils' import { processSlot } from './utils/compileSlots' @@ -153,11 +155,22 @@ export function createInstance( if (isObjectComponent(originalComponent)) { // component is guaranteed to be the same type as originalComponent const objectComponent = component as ComponentOptions - const originalDataFn = originalComponent.data || (() => ({})) - objectComponent.data = (vm) => ({ - ...originalDataFn.call(vm, vm), - ...providedData - }) + if (originalComponent.data) { + const originalDataFn = originalComponent.data + objectComponent.data = (vm) => ({ + ...originalDataFn.call(vm, vm), + ...providedData + }) + } else if (objectComponent.setup) { + const originalSetupFn = objectComponent.setup + objectComponent.setup = function (a, b) { + const data = originalSetupFn(a, b) + mergeDeep(proxyRefs(data), providedData) + return data + } + } else { + objectComponent.data = () => ({ ...providedData }) + } } else { throw new Error( 'data() option is not supported on functional and class components' diff --git a/src/vueWrapper.ts b/src/vueWrapper.ts index eae562f89..61c5edd20 100644 --- a/src/vueWrapper.ts +++ b/src/vueWrapper.ts @@ -1,4 +1,4 @@ -import { nextTick, App, ComponentPublicInstance, VNode } from 'vue' +import { nextTick, App, ComponentPublicInstance, VNode, proxyRefs } from 'vue' import { config } from './config' import domEvents from './constants/dom-events' @@ -247,7 +247,29 @@ export class VueWrapper< } setData(data: Record): Promise { - mergeDeep(this.componentVM.$data, data) + /* + Depending on how the component was defined, data can live in different places + Vue sets some default placeholder in all the locations however, so we cannot just check + if the data object exists or not. + When using