File tree 2 files changed +57
-4
lines changed
2 files changed +57
-4
lines changed Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ export class Vue3 {
21
21
initDataProxy ( ) {
22
22
const data = this . $options . data ? this . $options . data ( ) : { } ;
23
23
const props = this . $props ;
24
+ const computed = this . $options . computed || { } ;
24
25
25
26
const createDataProxyHandler = ( path ) => {
26
27
return {
@@ -80,9 +81,9 @@ export class Vue3 {
80
81
return createDataProxyHandler ( ) . get ( props , key ) ;
81
82
} else if ( key in data ) { // 收集模板中用了 data 的属性到依赖集合中
82
83
return createDataProxyHandler ( ) . get ( data , key ) ;
83
- }
84
-
85
- if ( key in methods ) {
84
+ } else if ( key in computed ) {
85
+ return computed [ key ] . call ( this . proxy ) ;
86
+ } else if ( key in methods ) {
86
87
return methods [ key ] . bind ( this . proxy ) ;
87
88
}
88
89
@@ -169,7 +170,7 @@ export class Vue3 {
169
170
element . setAttribute ( key , vnode . attributes [ key ] ) ;
170
171
}
171
172
172
- // set DOM event listener
173
+ // Set DOM event listener
173
174
const events = ( vnode . attributes || { } ) . on || { } ;
174
175
for ( let key in events ) {
175
176
element . addEventListener ( key , events [ key ] ) ;
Original file line number Diff line number Diff line change
1
+ import { Vue3 } from "../src" ;
2
+
3
+ describe ( 'computed' , ( ) => {
4
+ it ( 'basic' , ( ) => {
5
+ const vm = new Vue3 ( {
6
+ data ( ) {
7
+ return { a : 'hello' , b : 'world' } ;
8
+ } ,
9
+ computed : {
10
+ c ( ) {
11
+ return this . a + ' ' + this . b ;
12
+ }
13
+ } ,
14
+ render ( createElement ) {
15
+ return createElement ( 'div' , { } , this . c ) ;
16
+ }
17
+ } ) . $mount ( ) ;
18
+
19
+ expect ( vm . c ) . toEqual ( 'hello world' ) ;
20
+ expect ( vm . $el . textContent ) . toEqual ( 'hello world' ) ;
21
+
22
+ vm . a = 'bye' ;
23
+ expect ( vm . c ) . toEqual ( 'bye world' ) ;
24
+ expect ( vm . $el . textContent ) . toEqual ( 'bye world' ) ;
25
+ } ) ;
26
+
27
+ it ( 'chain' , ( ) => {
28
+ const vm = new Vue3 ( {
29
+ data ( ) {
30
+ return { a : 'hello' , b : 'world' } ;
31
+ } ,
32
+ computed : {
33
+ c ( ) {
34
+ return this . a + ' ' + this . b ;
35
+ } ,
36
+ d ( ) {
37
+ return this . c + '!!!' ;
38
+ } ,
39
+ } ,
40
+ render ( createElement ) {
41
+ return createElement ( 'div' , { } , this . d ) ;
42
+ }
43
+ } ) . $mount ( ) ;
44
+
45
+ expect ( vm . d ) . toEqual ( 'hello world!!!' ) ;
46
+ expect ( vm . $el . textContent ) . toEqual ( 'hello world!!!' ) ;
47
+
48
+ vm . a = 'bye' ;
49
+ expect ( vm . d ) . toEqual ( 'bye world!!!' ) ;
50
+ expect ( vm . $el . textContent ) . toEqual ( 'bye world!!!' ) ;
51
+ } ) ;
52
+ } ) ;
You can’t perform that action at this time.
0 commit comments