一句话归纳:接受一个类做为参数的函数,用来修改类的行为。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