码迷,mamicode.com
首页 > 其他好文 > 详细

React HOC(高阶组件)

时间:2020-02-26 18:29:14      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:渲染   hand   param   key   tst   value   struct   handles   const   

一、定义

  高阶函数:函数接受函数作为输入,或者输出一个函数。

  高阶组件:接受React组件作为输入,或是输出一个组件。即hocFactory:: W: React.Component => E: React.Component

  高阶组件让代码更有复用性、逻辑性、抽象性。

二、实现高阶函数的三种方法。

  1. 属性继承??(将Input组件的name,onChange方法提取到高阶组件中)

const Mycontainer = (WrappedComponent) => {
    class extends React.Component {
constructor(props) {
     super(props);
      this.state = {
       name: ‘‘,
     }
     this.onNameChange = this.onNameChange.bind(this);
    }
    onNameChange(event) {
     this.state({
      name: event.target.value,
     })
    } render() {
     const newProps = { name:{
      value: this.state.name,
      onChange: this.onNameChange,
     } };
return <WrappedComponent {...this.props} {...newProps}/>; } } } class MyComponent extends React.Component { // ... } export default Mycontainer(MyComponent);

  2. 反向继承

  ??渲染劫持: 就是高阶组件可以控制组件渲染以及props,state等。

const MyContainer = WrappedComponent =>
  class extends WrappedComponent {
    render() {
      if (this.props.loggedIn) {
        return super.render();
      } else {
        return null;
      }
    }
  }

     3. 组件参数

     ??调用高阶组件时需要传递一些参数

function HOCFactoryFactory(...params) {
  // 可以做一些改变params的事情
  return function HOCFactory(WrappedComponent) {
    return class HOC extends Component {
      render() {
        return <WrappedComponent {...this.props} {...params}/>
      }
    }
  }
}

HOCFactoryFactory(params)(WrappedComponent);

三、使用高阶组件使组件分离,抽象逻辑。

class SelectInput extends React.Component {
  static displayName = ‘SelectInput‘;

  render() {
    const { selectedItem, isActive, onClickHeader, placeholder } = this.props;
    const { text } = selectedItem;

    return (
      <div>
        <div onClick={onClickHeader}>
          <input type="text" disabled value={text} placeholder={placeholder}/>
          <Icon className={isActive} name="angle-name"/>
        </div>
      </div>
    );
  }
}

const searchDecorator = WrappedComponent => {
  class SearchDecorator extends React.Component {
    constructor(props){
      super(props);

      this.handleSearch = this.handleSearch.bind(this);
    }

    handleSearch(keyword) {
      this.setState({
        data: this.props.data,
        keyword,
      });
      this.props.onSearch(keyword);
    }

    render() {
      const { data, keyword } = this.state;
      return (
        <WrappedComponent
          {...this.props}
          data={data}
          keyword={keyword}
          onSearch={this.handleSearch}
        />
      )
    }
  }
  return SearchDecorator;
}

const asyncSelectDecorator = WrappedComponent => {
  class AsyncSelectDecorator extends React.Component {
    componentDidMount() {
      const { url, params } = this.props;

      fetch(url, { params }).then(data => {
        this.setState({
          data,
        });
      });
    }
    render() {
      return (
        <WrappedComponent
          {...this.props}
          data={this.state.data}
        />
      )
    }
  }
  return AsyncSelectDecorator;
}

class App extends React.Component {
  render() {
  const Input = searchDecorator(asyncSelectDecorator(SelectInput))
return {     <Input {...this.props} />
  } 
 }
}

 

React HOC(高阶组件)

标签:渲染   hand   param   key   tst   value   struct   handles   const   

原文地址:https://www.cnblogs.com/fange/p/12368119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!