zl程序教程

您现在的位置是:首页 >  Java

当前栏目

在Vue中初次使用装饰器(Decorator)

2023-02-18 16:40:57 时间

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>