1. 扩展eslintConfig配置
{ "eslintConfig": { ... "parserOptions": { ... "ecmaFeatures": { "legacyDecorators": true } } ... } }
2. 关闭Vetur提示(项目级别)
{ "vetur.validation.script": false, }
3. 新建装饰器函数: src\decorators\index.js
export function confirm(message, title, cancel) { return (target, name, descriptor) => { console.log('name ', name); console.log('target ', target); console.log('descriptor ', descriptor); // 保存被装饰的函数 const fn = descriptor.value // 重写函数扩展功能 descriptor.value = function (...reset) { const result = window.confirm(`${title}\n\n${message}`) if (result) { // 执行原函数 fn.apply(this, reset) } else { // 执行取消函数并绑定this便于后续使用 cancel && cancel.apply(this, []) } } } }
4. 使用装饰器完成功能
<script> import { confirm } from "./decorators"; export default { name: "App", methods: { @confirm("确定要删除吗?", "提示", function() { // 通过在装饰器函数中使用apply改变this,使得此处可以使用定义的cancel函数 this.cancel(); }) // 简化在删除功能中的二次确认部分 deleteItem(id) { console.log("删除成功", id); }, cancel() { console.log("取消了"); }, }, }; </script>