最近在搗鼓Typescript的裝飾器,NodeJs項目的裝飾器比較好理解,可是React項目的裝飾器因爲有JSX,走了一點彎路,可是總之來講是新技能get
react
裝飾器是一種特殊類型的聲明,它可以被附加到類聲明,方法, 訪問符,屬性或參數上。 裝飾器使用 @expression這種形式,expression求值後必須爲一個函數,它會在運行時被調用,被裝飾的聲明信息作爲參數傳入。git
裝飾器爲咱們提供了運行時修改數據
的能力。github
Parent.tsxtypescript
@Component
export default class App extends PureComponent {
handleClick() {
console.log('parent click');
}
render() {
return (
<div className="App" onClick={this.handleClick}>parent</div>
);
}
}
複製代碼
Component裝飾器express
function Component<T extends { new(...args: any[]): any }>(component: T) { // 泛型限定
return class extends component {
handleClick() { // 劫持onClick
super.handleClick()
console.log('child clicked');
}
render() {
const parent = super.render()
// 劫持onClick
return React.cloneElement(parent, { onClick: this.handleClick })
}
}
}
複製代碼
點擊渲染以後的parent
字符,能夠看到劫持成功微信
本文寫的只是比較簡單的裝飾器用法,可是能夠基於此文的原來來開發如登陸後才能訪問的組件
之類的裝飾器,將業務邏輯更好的組織起來。ui
對TS有興趣的夥伴能夠加我微信交流~this