File tree Expand file tree Collapse file tree 3 files changed +97
-2
lines changed Expand file tree Collapse file tree 3 files changed +97
-2
lines changed Original file line number Diff line number Diff line change @@ -36,9 +36,20 @@ export function componentFactory (
3636 return
3737 }
3838 const descriptor = Object . getOwnPropertyDescriptor ( proto , key ) !
39- if ( typeof descriptor . value === 'function' ) {
39+ if ( descriptor . value !== void 0 ) {
40+
4041 // 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+
4253 } else if ( descriptor . get || descriptor . set ) {
4354 // computed properties
4455 ( 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', () => {
2828 expect ( c . bar ) . to . equal ( 2 )
2929 } )
3030
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+
3173 it ( 'should not collect uninitialized class properties' , ( ) => {
3274 const Prop = createDecorator ( ( options , key ) => {
3375 if ( ! options . props ) {
Original file line number Diff line number Diff line change @@ -60,6 +60,48 @@ describe('vue-class-component', () => {
6060 expect ( c . b ) . to . equal ( 2 )
6161 } )
6262
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+
63105 it ( 'data: should collect custom property defined on beforeCreate' , ( ) => {
64106 @Component
65107 class MyComp extends Vue {
You can’t perform that action at this time.
0 commit comments