在 Vue 中使用 装饰器 Decorator

Decorator 的语法还没有通过提案,所以项目中很少用。不过最近刚好有一个需求用到了。

装饰器的语法 http://es6.ruanyifeng.com/#docs/decorator

需求是,有很多操作都需要二次确认,因为用到的是 element ui 组件,所以就需要在每个函数中都加一个确认操作。

deleteFile(data) {
    this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        type: 'warning'
    }).then(() => {
        // 删除文件操作
    }).catch(() => {});
}

 

每个函数都加一遍。。感觉有点冗余。。于是想到了使用注释器将 confirm 提出去。

import { MessageBox } from 'element-ui';

function confirmation(target, name, descriptor) {
    let oldValue = descriptor.value;
    descriptor.value = function(...args) {
        MessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示')
            .then(oldValue.bind(this, ...args))
            .catch(() => {});
    };

    return descriptor;
}
@confirmation
deleteFile(data) {
    // 删除文件操作
}

 

这样只需要在需要二次确认的函数上加一个  @confirmation  即可。

 

不过不同的操作需要的提示往往不一样,那就在注释器上加一个参数。

import { MessageBox } from 'element-ui';

export function confirmation(message) {
    return function(target, name, descriptor) {
        let oldValue = descriptor.value;
        descriptor.value = function(...args) {
            MessageBox.confirm(message, '提示')
                .then(oldValue.bind(this, ...args))
                .catch(() => {});
        };

        return descriptor;
    }
}
@confirmation('此操作将永久删除该文件, 是否继续?')
deleteFile(data) {
    // 删除文件操作
}

 

以上。。

posted @ 2019-12-04 18:10  我不吃饼干呀  阅读(9754)  评论(0编辑  收藏  举报