戳蓝字"
Web前端严选
"
关注我们哦
!
初衷: 前几天我在公司其它Vue项目中,发现了是用Decorator装饰器模式开发的,看起来整体代码还不错,于是就做了一下笔记分享给大家,不喜勿喷。
本项目是使用js
和Decorator
装饰器搭建,如果大家项目用的是ts
,那么使用装饰器方法跟本文介绍的不同,请自行参考ts
使用装饰器。需要注意的是,使用这种模式,变量会存在污染,所以不能出现重名变量。
Decorator
装饰器是一种类class
相关的语法,所以Decorator
装饰器只能用在class
类里面,在普通的语法或表达式上不能使用。个人理解:装饰器可以给我们提供一层拦截的作用,先执行装饰器里面的东西,后执行我们的操作。具体请看阮一峰老师的《装饰器》。
组件
npm install --save vue-class-component
npm install --save vue-property-decorator
配置
在项目的根目录babel.config.js
进行配置如下
module.exports = {
presets: [
'@vue/app'
],
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }],
]
}
在项目的根目录jsconfig.json
进行配置如下
{
"compilerOptions": {
"experimentalDecorators": true
}
}
我这里就介绍一下在Vue中常用的几个方法,具体详细的可以看这里Vue-property-decorator
这些写法都跟原来一样,直接写就行,看如下案例对比
原写法
装饰器写法
原写法
装饰器写法
原写法
装饰器写法
原写法
export default {
inject: {
msg: {
default: () => "",
required: true
}
}
}
装饰器写法
import { Vue, Component,Inject } from 'vue-property-decorator'
@Component
class Hello extends Vue {
@Inject({ required: true, default: () => "" }) msg
}
export default Hello
原写法
装饰器写法
原写法
// 父组件
// 子组件
装饰器写法
@PropSync
第一个参数则是,this.$emit("update:msg")
里面的msg
, 语句后面则跟着变量
原写法
export default {
data() {
return {
str: 123
}
},
created() {
setTimeout(() => {
this.str = 12
}, 5000)
},
watch: {
str: function(newVal, oldVal) {
console.log(newVal, oldVal)
}
}
}
装饰器写法
import { Vue, Component, Watch } from 'vue-property-decorator'
@Component
class Hello extends Vue {
str = 123
created() {
setTimeout(() => {
this.str = 12
}, 2000)
}
@Watch("str", {deep: true})
test(newVal, oldVal) {
console.log(newVal, oldVal)
}
}
export default Hello
原写法
装饰器写法
装饰器写法
// 父组件
// 子组件
原写法
装饰器写法
该方法是从组件库中导入,如果使用使用生命周期方法,记得引入此装饰器,否则不生效。该装饰器接收一个对象里面也可以写原生Vue
方法。
当然了可以根据自己的需求扩展封装Decorator
装饰器,装饰器接收三个参数
目标对象
目标key
描述对象
这里不明白描述对象属性可以看这篇文章《深入理解JavaScript对象》
上面example中,可扩展自己的Decorator
装饰器,装饰器就相当于起一层拦截作用,先执行装饰器里面的操作,在执行我们函数本身的逻辑操作。我这里只做一个案例哈,具体看你们的需求。
如果你觉得这篇内容对你挺有有帮助的话:
看到这里了就点个在看支持一下吧,你的[在看]是我创作的动力;
关注公众号【Web前端严选】,进交流群,定期为你推送好文。
添加个人微信,进群与小伙伴一起玩耍(已经推出)~