diff --git a/packages/parser/src/shared/utils.ts b/packages/parser/src/shared/utils.ts
index 6e0782006..b24ea32d0 100644
--- a/packages/parser/src/shared/utils.ts
+++ b/packages/parser/src/shared/utils.ts
@@ -32,8 +32,10 @@ export function traverseAST(
}
export function generateCode(node: Node) {
+ if (!node) return '';
try {
const func = (generate as any).default || generate;
+
const generated = func(node, {
comments: false,
concise: true,
diff --git a/packages/parser/src/vue/scripts.ts b/packages/parser/src/vue/scripts.ts
index c1e4aacfc..128c245c2 100644
--- a/packages/parser/src/vue/scripts.ts
+++ b/packages/parser/src/vue/scripts.ts
@@ -196,10 +196,24 @@ function getState(block: BlockStatement) {
if (!stateExpression) return {};
const state: BlockState = {};
for (const item of stateExpression.properties) {
- const { key, value } = item as ObjectProperty;
- if (key.type === 'Identifier') {
- const code = generateCode(value);
- state[key.name] = getJSExpression(code);
+ if (item.type === 'ObjectProperty') {
+ const { key, value } = item as ObjectProperty;
+ if (key.type === 'Identifier') {
+ const code = generateCode(value);
+ state[key.name] = getJSExpression(code);
+ }
+ } else if (item.type === 'ObjectMethod') {
+ const { key, params, body } = item as ObjectMethod;
+ if (key.type === 'Identifier') {
+ const bodyCode = generateCode(body);
+ const paramsCode = params
+ .map((n) => {
+ return (n as any).name || 'none';
+ })
+ .join(',');
+ const code = `(${paramsCode}) => ${bodyCode}`;
+ state[key.name] = getJSExpression(code);
+ }
}
}
return state;
diff --git a/packages/parser/tests/sources/test_27.ts b/packages/parser/tests/sources/test_27.ts
index 07fac67b7..eafbfce28 100644
--- a/packages/parser/tests/sources/test_27.ts
+++ b/packages/parser/tests/sources/test_27.ts
@@ -1,48 +1,36 @@
export const test_27 = `
-
-
-
-
+
+
+
+
+
+
+
+ {{ tab.title }}
+
+
+