装饰器

配置装饰器语法环境

第一步:yarn add @babel/plugin-proposal-decorators 用于解析装饰器语法。
第二步:在项目根目录下创建 config-overrides.js,配置一个loader——addDecoratorsLegacy。

module.exports = override(
	addDecoratorsLegacy()
)

第三步:在项目根目录下创建 jsconfig.json,追加一个配置:"experimentalDecorators":true

{
  "compilerOptions": {
    "experimentalDecorators":true,
    "baseUrl": "./",
    "paths": {
        "@/*": ["src/*"]
    }
  },
  "exclude": ["node_modules", "dist"]
}

装饰器语法的三种情况

第一种:

装饰器函数没有 return ( return 不是 undefined,因为没有 return ,必须程序员手写 return ,才有return )

//这是一个装饰器函数:
function demo(target) {
	target.a = 1
	target.b = 2
}

使用装饰器语法,代码如下:

@demo
class MyClass {}

console.dir(MyClass):
在这里插入图片描述

上方的装饰器语法,会被翻译为如下代码:

class MyClass {}
demo(MyClass) 

第二种:

装饰器函数有返回值
例1:

//这是一个装饰器函数:
function demo(target) {
	target.a = 1
	target.b = 2
	return 100
}

使用装饰器语法,代码如下:

@demo
class MyClass {}

console.log ( MyClass ) :
在这里插入图片描述

例2:

//这是一个装饰器函数:
unction demo(target) {
  let obj = {name:'lisi',age:19}
	target.a = 1
	target.b = 2
	return {...obj,...target}
}

使用装饰器语法,代码如下:

@demo
class MyClass {}

console.log ( MyClass ) :
在这里插入图片描述


上方的装饰器语法,会被翻译为如下代码:

class MyClass {}
MyClass = demo(MyClass) 

第三种:

装饰器函数是另外一个函数的返回值

//这是一个装饰器函数:
function test(){
	function demo(target) {
		target.a = 1
		target.b = 2
		return target
	}
	return demo
}

使用装饰器语法,代码如下:

@test()
class MyClass {}

上方的装饰器语法,会被翻译为如下代码:

class MyClass {}
MyClass = test()(MyClass)

用装饰器语法的场景

react-redux 中的 connect()函数,相当于一个装饰器函数(第三种情况)

使用装饰器语法之前:

import {connect} from 'react-redux'
import React, { Component } from 'react'

class Count extends Component {}

export default connect(
  state => ({ }),
  { }
)(Count)

使用装饰器语法之后:

import {connect} from 'react-redux'
import React, { Component } from 'react'

@connect(
	state => ({ }),
	{ }
)

class Count extends Component {}

export default Count  // Count = connect()(Count)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值