Skip to content

Commit e6fc724

Browse files
author
Xiang Liu
committed
(vue3): computed
1 parent ba281f2 commit e6fc724

File tree

2 files changed

+57
-4
lines changed

2 files changed

+57
-4
lines changed

vue/vue3/src/index.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export class Vue3 {
2121
initDataProxy() {
2222
const data = this.$options.data ? this.$options.data(): {};
2323
const props = this.$props;
24+
const computed = this.$options.computed || {};
2425

2526
const createDataProxyHandler = (path) => {
2627
return {
@@ -80,9 +81,9 @@ export class Vue3 {
8081
return createDataProxyHandler().get(props, key);
8182
} else if (key in data) { // 收集模板中用了 data 的属性到依赖集合中
8283
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) {
8687
return methods[key].bind(this.proxy);
8788
}
8889

@@ -169,7 +170,7 @@ export class Vue3 {
169170
element.setAttribute(key, vnode.attributes[key]);
170171
}
171172

172-
// set DOM event listener
173+
// Set DOM event listener
173174
const events = (vnode.attributes || {}).on || {};
174175
for (let key in events) {
175176
element.addEventListener(key, events[key]);

vue/vue3/test/computed.spec.js

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
});

0 commit comments

Comments
 (0)