React 高阶组件 重用逻辑

留个坑,以后填。


简单的示例代码,介绍了React高阶组件的运作方式:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import { PassThrough } from 'stream';

function makeComponent(WrappedComponent, selectData) {
    return class extends React.Component {
        constructor(props) {
            super(props);
            //HOC 应该透传与自身无关的 props,此处color是给color的,其他的透传
            const { color, ...PassThroughProps } = props;
            this.state = { data: selectData };
        }
        componentDidMount() {
            this.setState({ data: this.state.data + 'New!' });
        }
        render() {
            return (<WrappedComponent data={this.state.data} {...this.PassThroughProps} />);
        }
    }
}

function Child(props) {
    return (<div><h1>props.data:{props.data}</h1></div>);
}

function Child2(props) {
    return (<div><h1>props.data:{props.data}</h1></div>);
}

const MyChild1 = makeComponent(Child, 'MyChild1');
const MyChild2 = makeComponent(Child2, 'MyChild2');

class App extends React.Component {
    render() {
        return (
            <div>
                <MyChild1 color="white"></MyChild1>
                <MyChild2></MyChild2>
            </div>
        );
    }
}

ReactDOM.render(<App />, document.getElementById('root'));

总觉得这个这个并没有生成新的组件,而是作为中间件存在了。
毕竟返回的是原来的组件嘛,如果说哪里出现了变化,那一定是数据。
因为要对数据进行非常类似的处理,所以需要复用的是逻辑。
而且HOC保证不会修改组件,所以我对“生成新的组件”这句话表示怀疑。

这里头有几个重点需要注意:
1.组件作为变量般存在:
此时组件作为一等值的身份展露无疑,请转换思维,把它当做一般的变量看待。
2.不是‘改变’组件,而是‘增强’组件:
传入组件》包装组件(永久/非永久预处理)》增强组件。
这个过程不改变组件本身,就算改变了组件本身,也没有办法一般化,因为每次都是返回一个新的组件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。