Skip to content

Commit 7cdb0ed

Browse files
committed
apply props before calling data function
1 parent c3b7742 commit 7cdb0ed

File tree

5 files changed

+37
-17
lines changed

5 files changed

+37
-17
lines changed

src/component.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import { build as optionEmit } from './option/emit'
1111
import { build as optionVModel, VModelConfig } from './option/vmodel'
1212
import { build as optionAccessor } from './option/accessor'
1313
import { OptionBuilder } from './optionBuilder'
14-
15-
export interface Cons { new(): any, prototype: any }
14+
import type { VueCons } from './index'
15+
export type Cons = VueCons
16+
// export interface Cons { new(): any, prototype: any }
1617
function ComponentOption(cons: Cons, extend?: any) {
1718
const optionBuilder: OptionBuilder = {}
1819
optionVModel(cons, optionBuilder)
@@ -26,8 +27,8 @@ function ComponentOption(cons: Cons, extend?: any) {
2627
optionAccessor(cons, optionBuilder)
2728
const raw = {
2829
data() {
29-
const optionBuilder: OptionBuilder = {}
30-
optionData(cons, optionBuilder)
30+
delete optionBuilder.data
31+
optionData(cons, optionBuilder, this)
3132
return optionBuilder.data ?? {}
3233
},
3334
methods: optionBuilder.methods,

src/index.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export { decorator as Hook } from './option/methodsAndHooks'
1111
import type {
1212
ComponentPublicInstance
1313
} from 'vue'
14+
import type { OptionBuilder } from './optionBuilder'
1415
const IdentifySymbol = Symbol('vue-facing-decorator-identify')
1516
export interface BaseTypeIdentify {
1617
[IdentifySymbol]: undefined
@@ -19,15 +20,25 @@ export function TSX<Properties extends {} = {}, Events extends {} = {}>() {
1920

2021

2122
type Bundle = Properties & { [index in keyof Events as `on${Capitalize<index & string>}`]: Events[index] extends Function ? Events[index] : { (param: Events[index]): any } }
22-
return function <C extends { new(): ComponentPublicInstance & BaseTypeIdentify }>(cons: C) {
23+
return function <C extends VueCons>(cons: C) {
2324
return cons as unknown as {
2425
new(): Omit<ComponentPublicInstance<(InstanceType<C>['$props']) & Bundle>, keyof Bundle> & InstanceType<C>//& ComponentPublicInstance & BaseTypeIdentify
2526
}
2627
}
2728
}
2829

29-
export const Base = class { } as {
30-
new(): ComponentPublicInstance & BaseTypeIdentify
30+
export type VueCons = {
31+
new(optionBuilder: OptionBuilder, vueInstance: any): ComponentPublicInstance & BaseTypeIdentify
3132
}
32-
export const Vue = Base
3333

34+
export const Base = class {
35+
constructor(optionBuilder: OptionBuilder, vueInstance: any) {
36+
const props = optionBuilder.props
37+
if (props) {
38+
Object.keys(props).forEach(key => {
39+
(this as any)[key] = vueInstance[key]
40+
})
41+
}
42+
}
43+
} as VueCons
44+
export const Vue = Base

src/option/data.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ import { makeObject } from '../utils'
22
import { Cons } from '../component'
33
import { OptionBuilder } from '../optionBuilder'
44
import { obtainSlot, excludeNames, getValidNames } from '../utils'
5-
export function build(cons: Cons, optionBuilder: OptionBuilder) {
5+
export function build(cons: Cons, optionBuilder: OptionBuilder, vueInstance: any, propNames?: string[]) {
66
optionBuilder.data ??= {}
7-
const sample = new cons
8-
7+
const sample = new cons(optionBuilder, vueInstance)
98
let names = getValidNames(sample, (des) => {
109
return !!des.enumerable
1110
})
12-
1311
const slot = obtainSlot(cons.prototype)
1412
names = excludeNames(names, slot)
1513
Object.assign(optionBuilder.data, makeObject(names, sample))

test/option/accessor.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import { mount } from '@vue/test-utils'
33
import { expect } from 'chai';
44
import 'mocha';
5-
import { wrap } from 'module';
65
import { Component, Base ,Vanilla} from '../../dist'
76

87
@Component

test/option/data.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
11

22
import { expect } from 'chai';
33
import 'mocha';
4-
import { Component, Ref, Base } from '../../dist'
4+
import { Component, Base, Prop } from '../../dist'
5+
import { mount } from '@vue/test-utils'
56

67
@Component
78
export class Comp extends Base {
8-
data='data value'
9-
9+
data = 'data value'
10+
@Prop
11+
prop!: string
12+
fieldInitProp = this.prop
1013
}
14+
1115
const CompContext = Comp as any
1216

1317
describe('option data',
1418
() => {
1519
it('default', () => {
20+
const vm = mount(CompContext, {
21+
props: {
22+
prop:'prop test'
23+
}
24+
}).vm
25+
1626
expect('function').to.equal(typeof CompContext?.data)
1727
expect('data value').to.equal(CompContext.data().data)
18-
expect(1).to.equal(Object.keys(CompContext.data()).length)
28+
expect(2).to.equal(Object.keys(CompContext.data()).length)
29+
expect('prop test').to.equal(vm.fieldInitProp)
1930
})
2031
}
2132
)

0 commit comments

Comments
 (0)