高阶组件***

let Root = props => <div>{props.Name}</div>;
如果要在上例的Root组件进行增强怎么办?例如将Root组件的div外部再加入其它div。

let Wrapper = function (Component, props) {
    return (
        <div>
            {props.name}
            <hr />
            <Component />
        </div>
    );
};

let Root = props => <div>{props.name}</div>;

为了以后用的方便,柯里化这个Wrapper函数

import React from 'react'
import ReactDom from 'react-dom'

let Wrapper = function (Component)
    function _wrapper (props) {
        return (
            <div>
            {props.name}
            <hr />
            <Component />
            </div>
        );
    };
    return _wrapper;
};

let Root = props => <div>Root</div»;

let NewComp = Wrapper (Root) //
ReactDom.render (<NewComp name="Gloo"/>, document. getElementById ('root'));

简化Wrapper

let Wrapper = function (Component)
    return (props) => {
        return (
        <div>
            {props.name}
            <hr />
            <Component />
        </div>
        );
    };
};

再次变化

let Wrapper = function (Component)
    return (props) => (
        <div>
        {props.name}
        <hr />
        <Component />
        </div>
    );
};

再次变化

let Wrapper = Component => props => (
    <div>
        {props.name}
        <hr />
        <Component />
    </div>
);

let Root = props => <div>Root</div>;

let NewComp = Wrapper(Root)

ReactDom.render(<NewComp name='Gloo' />, document.getElementById('root')) ;

装饰器

新版ES 2016中增加了装饰器的支持,因此可以使用装饰器来改造上面的代码

@wrapper // 这是不对的,装饰器装饰函数或类
let Root = props => <div>Root</div>;

ES 2016的装饰器只能装饰类,所以,将Root改写成类。

import React from 'react';
import ReactDom from 'react-dom';

let Wrapper = Component => props =>
(<div>
    {props.name}
    <hr />
    <Component />
</div>);

@Wrapper
class Root extends React. Component {
    render(){
        return <div>Root</div>;
    }
}

ReactDom.render(<Root name="Gloo" />, document.getElementById ('root')) ;

思考题

import React from 'react';
import ReactDom from 'react-dom':
let Wrapper = Component => props =>
(<div>
    {props.name}
    <hr />
    <Component {...props} />
</div>);

@Wrapper
class Root extends React. Component {
    render() {
        return <div>{this.props.name}</div>;
    }
}

ReactDom.render(<Root name="magedu" /›, document.getElementById('root')) ;

使用<Component {...props} />相当于给组件增加了属性。

带参装饰器

想给装饰器函数增加一个id参数

import React from 'react';
import ReactDom from 'react-dom':
let Wrapper =  id => Component => props =>
(<div id={id}>
    {props.name}
    <hr />
    <Component {...props} />
</div>);

@Wrapper('wrapper')  // 带参
class Root extends React. Component {
    render() {
        return <div>{this.props.name}</div>;
    }
}

ReactDom.render(<Root name="magedu" /›, document.getElementById('root')) ;

通过上面的改写,就得到带参装饰器