Decorator修饰器

Decorator

配置: decorator是ES7中的提案,所以需要babel转译后才能被现代浏览器解析。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// .babelrc 
/*
* @babel/preset-env 可以理解为预设的浏览器环境,可以在代码中使用最新的JavaScript代码,而不用针对不同兼 容性的代码去做不同的转换。 presets数组的解析顺序是数组的逆序,在此例中先使用@babel/preset-react,再使用@babel/preset-env,而plugins的解析顺序则与presets解析顺序相反,是数组的正序。
* 注意:@babel/plugin-proposal-decorators一定要写在@babel/plugin-proposal-class-properties之前
*/
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": [
["import", {
"libraryName": "antd",
// "libraryDirectory": "es",
"style": "css"
}],
["@babel/plugin-proposal-decorators", {
// "decoratorsBeforeExport": false, // 不能和proposal-class-properties一起使用
"legacy": true // 使用es-2015 stage-1 阶段
}],
["@babel/plugin-proposal-class-properties", {
"loose": true
}],
]
}

Decorator语法:

1、修饰类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@fly         
class Person {}

/*
* 由于此时还没有生成类的实例,所以这里的target为Person类
*
*/
function fly(target){
target.canFly = true
return target
}

Person.canFly // true
const p1 = new Person()
p1.canFly // undefined,如果想要类的实例也有这个属性,则可以在fly函数中: target.prototype.canFly = true

2、修饰类的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// App.js
class App extends Component {
componentDidMount() {
window.addEventListener("scroll", this.scroll, false);
}

@throttle
scroll() {
console.log("scroll");
}

render(){
return <div/>
}
}

// util.js
/*
* 函数节流,
*/
export function throttle(target, name, descriptor) {
const initialValue = descriptor.value;
const interval = 1000;
let timer = undefined;
descriptor.value = function(...args) {
if (timer) return;
timer = setTimeout(() => {
clearTimeout(timer);
timer = undefined;
}, interval);
initialValue.call(this, args); // 执行原函数
};
return descriptor;
}

https://juejin.im/post/5cbeadb95188250aa52c7b1b

# ES7

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×