Skip to content

Commit 64b0733

Browse files
authored
Merge pull request #300 from vuejs/fix/support-computed-properties-class-component
Support computed properties class component
2 parents 3706e5d + 8f78919 commit 64b0733

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed
Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1-
21
<template>
3-
<div>{{ msg }}</div>
2+
<div>
3+
<h1 data-computed>{{ computedMsg }}</h1>
4+
<h2 data-props>{{ msg }}</h2>
5+
<h3 data-methods>{{ dataText }}</h3>
6+
<button @click="changeMessage" />
7+
</div>
48
</template>
59

610
<script lang="ts">
7-
import { Vue, Options } from 'vue-class-component'
8-
11+
import { Options, Vue } from 'vue-class-component'
912
@Options({
10-
props: ['msg']
13+
props: {
14+
msg: String
15+
}
1116
})
12-
export default class ClassComponent extends Vue {}
17+
export default class ClassComponent extends Vue {
18+
dataText: string = ''
19+
get computedMsg(): string {
20+
return `Message: ${(this.$props as any).msg}`
21+
}
22+
23+
changeMessage(): void {
24+
this.dataText = 'Updated'
25+
}
26+
}
1327
</script>

e2e/__projects__/basic/test.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createApp, h } from 'vue'
1+
import { createApp, h, nextTick } from 'vue'
22
import { resolve } from 'path'
33
import { readFileSync } from 'fs'
44

@@ -118,8 +118,19 @@ test('supports relative paths when extending templates from .pug files', () => {
118118
})
119119

120120
test('supports class component .vue files', () => {
121-
mount(ClassComponent, { msg: 'Hello' })
122-
expect(document.querySelector('div').textContent).toBe('Hello')
121+
expect.assertions(3)
122+
mount(ClassComponent, { msg: 'Props Message' })
123+
expect(document.querySelector('[data-computed]').textContent).toBe(
124+
'Message: Props Message'
125+
)
126+
expect(document.querySelector('[data-props]').textContent).toBe(
127+
'Props Message'
128+
)
129+
const event = new window.Event('click')
130+
document.querySelector('button').dispatchEvent(event)
131+
nextTick().then(() => {
132+
expect(document.querySelector('[data-methods]').textContent).toBe('Updated')
133+
})
123134
})
124135

125136
// TODO: How do functional components work in Vue 3?

lib/generate-code.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ module.exports = function generateCode(
3232
tempOutput.match(/\}\(.*.?Vue\);/) &&
3333
tempOutput.includes('vue-class-component')
3434
) {
35-
node.add(';exports.default = {...exports.default.__vccBase};')
35+
node.add(`
36+
;exports.default = {
37+
...exports.default.__vccBase,
38+
...exports.default.__vccOpts
39+
};`)
3640
}
3741

3842
if (tempOutput.includes('exports.render = render;')) {

0 commit comments

Comments
 (0)