File tree 3 files changed +97
-2
lines changed
3 files changed +97
-2
lines changed Original file line number Diff line number Diff line change @@ -36,9 +36,20 @@ export function componentFactory (
36
36
return
37
37
}
38
38
const descriptor = Object . getOwnPropertyDescriptor ( proto , key ) !
39
- if ( typeof descriptor . value === 'function' ) {
39
+ if ( descriptor . value !== void 0 ) {
40
+
40
41
// methods
41
- ( options . methods || ( options . methods = { } ) ) [ key ] = descriptor . value
42
+ if ( typeof descriptor . value === 'function' ) {
43
+ ( options . methods || ( options . methods = { } ) ) [ key ] = descriptor . value
44
+ } else {
45
+ // typescript decorated data
46
+ ( options . mixins || ( options . mixins = [ ] ) ) . push ( {
47
+ data ( this : Vue ) {
48
+ return { [ key ] : descriptor . value }
49
+ }
50
+ } )
51
+ }
52
+
42
53
} else if ( descriptor . get || descriptor . set ) {
43
54
// computed properties
44
55
( options . computed || ( options . computed = { } ) ) [ key ] = {
Original file line number Diff line number Diff line change @@ -28,6 +28,48 @@ describe('vue-class-component with Babel', () => {
28
28
expect ( c . bar ) . to . equal ( 2 )
29
29
} )
30
30
31
+ it ( 'should collect decorated class properties' , ( ) => {
32
+
33
+ const decorator1 = ( value ) => ( ) => {
34
+ return {
35
+ enumerable : true ,
36
+ value : value
37
+ }
38
+ }
39
+
40
+ const decorator2 = ( value ) => ( ) => {
41
+ return {
42
+ enumerable : true ,
43
+ get ( ) {
44
+ return value ;
45
+ }
46
+ }
47
+ }
48
+
49
+ @Component ( {
50
+ props : [ 'foo' ]
51
+ } )
52
+ class MyComp extends Vue {
53
+
54
+ @decorator1 ( 'field1' )
55
+ field1
56
+
57
+ @decorator2 ( 'field2' )
58
+ field2
59
+
60
+ foo
61
+ }
62
+
63
+ const c = new MyComp ( {
64
+ propsData : {
65
+ foo : 1
66
+ }
67
+ } )
68
+ expect ( c . field1 ) . to . equal ( 'field1' )
69
+ expect ( c . field2 ) . to . equal ( 'field2' )
70
+ expect ( c . foo ) . to . equal ( 1 )
71
+ } )
72
+
31
73
it ( 'should not collect uninitialized class properties' , ( ) => {
32
74
const Prop = createDecorator ( ( options , key ) => {
33
75
if ( ! options . props ) {
Original file line number Diff line number Diff line change @@ -60,6 +60,48 @@ describe('vue-class-component', () => {
60
60
expect ( c . b ) . to . equal ( 2 )
61
61
} )
62
62
63
+ it ( 'data: should collect from decorated class properties' , ( ) => {
64
+
65
+ const decorator1 = ( value : any ) => ( _ : any , __ :any ) : any => {
66
+ return {
67
+ enumerable : true ,
68
+ value
69
+ }
70
+ }
71
+
72
+ const decorator2 = ( value : any ) => ( _ : any , __ :any ) : any => {
73
+ return {
74
+ enumerable : true ,
75
+ get ( ) {
76
+ return value ;
77
+ }
78
+ }
79
+ }
80
+
81
+ @Component ( {
82
+ props : [ 'foo' ]
83
+ } )
84
+ class MyComp extends Vue {
85
+
86
+ @decorator1 ( 'field1' )
87
+ field1 ! : string
88
+
89
+ @decorator2 ( 'field2' )
90
+ field2 ! : string
91
+
92
+ foo ! : number
93
+ }
94
+
95
+ const c = new MyComp ( {
96
+ propsData : {
97
+ foo : 1
98
+ }
99
+ } )
100
+ expect ( c . field1 ) . to . equal ( 'field1' )
101
+ expect ( c . field2 ) . to . equal ( 'field2' )
102
+ expect ( c . foo ) . to . equal ( 1 )
103
+ } )
104
+
63
105
it ( 'data: should collect custom property defined on beforeCreate' , ( ) => {
64
106
@Component
65
107
class MyComp extends Vue {
You can’t perform that action at this time.
0 commit comments