一句話歸納:接受一個類做爲參數的函數,用來修改類的行爲。javascript
參考阮一峯老師es6語法介紹java
@testable class MyTestableClass { // ... } function testable(target) { target.isTestable = true; } MyTestableClass.isTestable // true
一句話歸納:接受一個組件做爲參數,返回一個組件的函數。es6
e.g.函數
// Target 是一個組件,它做爲參數傳給了Hoc這個函數 function Hoc(Target) { class Wrap extends Component { render() { return ( <div className='wrap'> <Target /> </div> ); } } return Wrap; }
import Hoc from './Hoc'; class A extends Component { render() { return ( <div> this is A </div> ); } } export default Hoc(A); //在這裏調用一下Hoc
function Hoc(Target, className) { class Wrap extends Component { render() { return ( <div className={className}> <Target /> </div> ); } } return Wrap; } //A.js ... export default Hoc(A, 'wrap');
import Hoc from './Hoc'; //這這裏@一下,A就會被當作參數傳給Hoc @Hoc class A extends Component { render() { return ( <div> this is A </div> ); } } export default A;
function Hoc(className) { //由於修飾器是一個只接受一個參數的函數,因此咱們返回一個函數出來,它纔是修飾器也是高階組件 //至關於執行 Hoc(className) 返回出來的纔是修飾器 return (Target) => { class Wrap extends Component { render() { return ( <div className={className}> <Target /> </div> ); } } return Wrap; }; } //A.js @Hoc('wrap') class A extends Component { render() { return ( <div> this is A </div> ); } } export default A; //等同於 class A extends Component { render() { return ( <div> this is A </div> ); } } export default Hoc('wrap')(A);
到這裏不知道小夥伴們看懂了沒有。this
咱們一般使用Hoc來作一些公共的邏輯,或者向子組件注入一些屬性,結合上修飾器,咱們能夠讓語法更加簡潔,維護起來更加方便。code