浅析什么是装饰器?Vue中怎么使用装饰器?

 2903

什么是装饰器?本篇文章带大家了解一下装饰器,简单介绍一下js、vue中使用装饰器的方法,希望对大家有所帮助!


浅析什么是装饰器?Vue中怎么使用装饰器?


相信各位在开发中一定遇到过二次弹框确认相关的需求。不管你使用的是UI框架的二次弹框组件,还是自己封装的弹框组件。都避免不了在多次使用时出现大量重复代码的问题。这些代码的积累导致项目的可读性差。项目的代码质量也变得很差。那么我们如何解决二次弹框代码重复的问题呢?使用装饰器

什么是装饰器?

DecoratorES7的一个新语法。Decorator通过对类、对象、方法、属性进行修饰。对其添加一些其他的行为。通俗来说:就是对一段代码进行二次包装。

装饰器的使用

使用方法很简单 我们定义一个函数

  1. const  decorator =  (target, name, descriptor) => {
  2.  var oldValue = descriptor.value
  3.  descriptor.value = function(){
  4.     alert('哈哈')
  5.     return oldValue.apply(this,agruments)
  6.        }
  7.   return descriptor
  8. }
  9. // 然后直接@decorator到函数、类或者对象上即可。

装饰器的目的旨在对代码进行复用。下面我们先来一个小例子看看

js中使用装饰器

  1. //定义一个装饰器 
  2. const log = (target, name, descriptor) => {
  3.   var oldValue = descriptor.value;
  4.   descriptor.value = function() {
  5.     console.log(`Calling ${name} with`, arguments);
  6.     return oldValue.apply(this, arguments);
  7.   };
  8.   return descriptor;
  9. }
  10.    //计算类
  11.   class Calculate {  
  12.   
  13.   //使用装饰器
  14.   @log() 
  15.   function  subtraction(a,b){
  16.      return  a - b
  17.    }
  18.  }
  19.   
  20. const operate  = new Calculate()
  21. operate.subtraction(5,2)

不使用装饰器

  1. const log = (func) => {
  2.   if(typeof(func) !== 'function') {
  3.     throw new Error(`the param must be a function`);
  4.   }
  5.   return (...arguments) => {
  6.     console.info(`${func.name} invoke with ${arguments.join(',')}`);
  7.     func(...arguments);
  8.   }
  9. }
  10.  
  11. const subtraction = (a, b) => a + b;
  12.  
  13. const subtractionLog = log(subtraction);
  14.  
  15. subtractionLog(10,3);

这样一对比你会发现使用装饰器后代码的可读性变强了。装饰器并不关心你内部代码的实现。

vue 中使用装饰器

如果你的项目是用vue-cli搭建的 并且vue-cli的版本大于2.5 那么你无需进行任何配置即可使用。如果你的项目还包含eslit 那么你需要在eslit中开启支持装饰器相关的语法检测。

  1. //在 eslintignore中添加或者修改如下代码:
  2. parserOptions: {
  3.     ecmaFeatures:{
  4.       // 支持装饰器
  5.       legacyDecorators: true
  6.     }
  7.   }

加上这段代码之后eslit就支持装饰器语法了。

通常在项目中我们经常会使用二次弹框进行删除操作:

  1. //decorator.js
  2. //假设项目中已经安装了 element-ui
  3. import { MessageBox, Message } from 'element-ui'
  4. /**
  5.  * 确认框
  6.  * @param {String} title - 标题
  7.  * @param {String} content - 内容
  8.  * @param {String} confirmButtonText - 确认按钮名称
  9.  * @param {Function} callback - 确认按钮名称
  10.  * @returns
  11.    **/
  12. export function confirm(title, content, confirmButtonText = '确定') {
  13.   return function(target, name, descriptor) {
  14.     const originValue = descriptor.value
  15.     descriptor.value = function(...args) {
  16.       MessageBox.confirm(content, title, {
  17.         dangerouslyUseHTMLString: true,
  18.         distinguishCancelAndClose: true,
  19.         confirmButtonText: confirmButtonText
  20.       }).then(originValue.bind(this, ...args)).catch(error => {
  21.         if (error === 'close' || error === 'cancel') {
  22.           Message.info('用户取消操作'))
  23.         } else {
  24.           Message.info(error)
  25.         }
  26.       })
  27.     }
  28.     return descriptor
  29.   }
  30. }

如上代码 confirm方法里执行了一个element-ui中的MessageBox组件 当用户取消时 Message组件会提示用户取消了操作。

我们在test()方法上用装饰器修饰一下

  1. import { confirm } from '@/util/decorator'
  2. import axios form 'axios'
  3. export default {
  4. name:'test',
  5. data(){
  6. return {
  7.   delList: '/merchant/storeList/commitStore'
  8.     }
  9.   }
  10. },
  11. methods:{
  12.  @confirm('删除门店','请确认是否删除门店?')
  13.   test(id){
  14.    const {res,data} = axios.post(this.delList,{id})
  15.    if(res.rspCd + '' === '00000') this.$message.info('操作成功!')
  16.   }
  17. }

此时用户点击某个门店进行删除。装饰器将会起作用。弹出如下图所示:


浅析什么是装饰器?Vue中怎么使用装饰器?


当我点击取消时:


浅析什么是装饰器?Vue中怎么使用装饰器?


tips: 用户取消了操作.被修饰的test方法不会执行

当我们点击确定时:


浅析什么是装饰器?Vue中怎么使用装饰器?


接口被调用了 并且弹出了message

总结

装饰器用于将一段代码进行二次包装。给代码增加一些行为操作和属性。 使用装饰器能大大减少代码的重复。增强代码可读性。

最后

文章若有不足之处,还请大家批评指出。


TAG标签:
本文网址:https://www.zztuku.com/index.php/detail-10847.html
站长图库 - 浅析什么是装饰器?Vue中怎么使用装饰器?
申明:本文转载于《掘金社区》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐