01-react高阶组件

高阶组件实质上就是高阶函数

下面的需求是当屏幕变化的时候,在屏幕上同步输出当前屏幕的尺寸

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


class Foo extends React.Component {
  state = { 
    x : document.documentElement.clientWidth,
    y : document.documentElement.clientHeight
   }
  componentDidMount() {
    window.addEventListener('resize',()=>{
      this.setState({
        x : document.documentElement.clientWidth,
        y : document.documentElement.clientHeight
      })
    })
  }
  componentWillUnmount() {
    window.removeEventListener('resize');
  }
  render() { 
    const {x,y} = this.state;
    return ( <div> {x}-----------{y} </div> );
  }
}

class Sub extends React.Component {
  state = { 
    x : document.documentElement.clientWidth,
    y : document.documentElement.clientHeight
   }
  componentDidMount() {
    window.addEventListener('resize',()=>{
      this.setState({
        x : document.documentElement.clientWidth,
        y : document.documentElement.clientHeight
      })
    })
  }
  componentWillUnmount() {
    window.removeEventListener('resize');
  }
  render() { 
    const {x,y} = this.state;
    return ( <button> {x}-----------{y} </button> );
  }
}
 
class App extends React.Component{
  render(){
    return(
      <>
      <Sub/>
      <Foo/>
      </>
    )
    
  }
}

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

我们可以看出Foo组件和Sub组件有大部分重复的逻辑代码,这时候我们可以运用高阶组价来提取重复的部分

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

const toSize= (Component)=>{
  return class WithSize extends React.Component{
    state = { 
      x : document.documentElement.clientWidth,
      y : document.documentElement.clientHeight
     }
    componentDidMount() {
      window.addEventListener('resize',()=>{
        this.setState({
          x : document.documentElement.clientWidth,
          y : document.documentElement.clientHeight
        })
      })
    }
    componentWillUnmount() {
      window.removeEventListener('resize');
    }
    render(){
      return(
      	//将数据通过props的方式传送给参数组件
        <Component {...this.state}/>
      )
    }
  }
}
class Foo extends React.Component {
  render() { 
    const {x,y} = this.props;
    return ( <div> {x}-----------{y} </div> );
  }
}


class Sub extends React.Component {
  render() { 
    const {x,y} = this.props;
    return ( <button> {x}-----------{y} </button> );
  }
}

const NewFoo = toSize(Foo)
const NewSub = toSize(Sub)
class App extends React.Component{
  
  render(){

    return(
      <div>
      <NewFoo/>
      <NewSub/>
      </div>
    )
    
  }
}

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

高阶组件只关心逻辑的复用,并不关心怎么渲染

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值