diff --git a/rules/no-useless-undefined.js b/rules/no-useless-undefined.js
index f5636e55d8..6b9af3bf32 100644
--- a/rules/no-useless-undefined.js
+++ b/rules/no-useless-undefined.js
@@ -70,6 +70,8 @@ const shouldIgnore = node => {
}
return compareFunctionNames.has(name)
+ // https://vuejs.org/api/reactivity-core.html#ref
+ || name === 'ref'
// `set.add(undefined)`
|| name === 'add'
// `map.set(foo, undefined)`
diff --git a/test/no-useless-undefined.mjs b/test/no-useless-undefined.mjs
index 830a87dcae..ed06d515d4 100644
--- a/test/no-useless-undefined.mjs
+++ b/test/no-useless-undefined.mjs
@@ -1,5 +1,5 @@
import outdent from 'outdent';
-import {getTester} from './utils/test.mjs';
+import {getTester, parsers} from './utils/test.mjs';
const {test} = getTester(import.meta);
@@ -436,3 +436,36 @@ test.snapshot({
'foo.notBind(bar, undefined)',
],
});
+
+test.snapshot({
+ testerOptions: {
+ parser: parsers.vue,
+ },
+ valid: [
+ outdent`
+
+ `,
+ outdent`
+
+ `,
+ ],
+ invalid: [
+ outdent`
+
+ `,
+ ],
+});
diff --git a/test/snapshots/no-useless-undefined.mjs.md b/test/snapshots/no-useless-undefined.mjs.md
index a960ffc2da..158c538dc4 100644
--- a/test/snapshots/no-useless-undefined.mjs.md
+++ b/test/snapshots/no-useless-undefined.mjs.md
@@ -299,3 +299,28 @@ Generated by [AVA](https://avajs.dev).
> 1 | foo.notBind(bar, undefined)␊
| ^^^^^^^^^ Do not use useless \`undefined\`.␊
`
+
+## Invalid #1
+ 1 |
+
+> Output
+
+ `␊
+ 1 | ␊
+ `
+
+> Error 1/1
+
+ `␊
+ 1 | ␊
+ `
diff --git a/test/snapshots/no-useless-undefined.mjs.snap b/test/snapshots/no-useless-undefined.mjs.snap
index 9424edf245..df70b8a758 100644
Binary files a/test/snapshots/no-useless-undefined.mjs.snap and b/test/snapshots/no-useless-undefined.mjs.snap differ