React Hook的概念与意义

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

类组件的不足:

  • 状态逻辑复用难
    • 缺少复用机制
    • 渲染属性和高阶组件导致层级冗余
  • 趋向复杂难以维护
    • 生命周期函数混杂不相干逻辑
    • 相干逻辑分散在不同生命周期
  • this指向困扰
    • 内联函数过度创建新句柄
    • 类成员函数不能保证this

Hook优化类组件的三个不足

  • 自定义Hook方便复用状态逻辑
  • 副作用的关注点分离
  • 函数组件无this问题

例子对比:

普通class组件

class Foo extends React.Component {
  state = {
   size:[window.innerWidth,window.innerHeight] 
  };
  onResize = ()=>{
    this.setState({
      size:[window.innerWidth,window.innerHeight]
    });
  }
  componentDidMount(){
    window.addEventListener("resize",this.onResize);
    document.title=this.state.size.join("x");
  }
  
  componentWillUnmount(){
    window.removeEventListener("resize",this.onResize);
    
  }
  

  render() {
    const [width,height] = this.state.size;
    return (
      <div>
        {width} x {height}
      </div>
    );
  }
}

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

渲染属性:

class Resizable extends React.Component {
  state = {
   size:[window.innerWidth,window.innerHeight] 
  };
  onResize = ()=>{
    this.setState({
      size:[window.innerWidth,window.innerHeight]
    });
  }
  componentDidMount(){
 
    window.addEventListener("resize",this.onResize);
    
  }
  componentWillUnmount(){
    window.removeEventListener("resize",this.onResize);
  }
 
  

  render() {
  
    return this.props.render(this.state.size);
  }
}

class Foo extends React.Component{
  render(){

    const [width,height] = this.props.size;
    return (
      <div>
        {width} x {height}
      </div>
    );
  }
}


ReactDOM.render(
  <Resizable render={size => <Foo size={size} />} />,
  document.getElementById('root')
);

高阶组件:

function resizable(Child) {
  return class Wrapper extends React.Component{
    
    state = {
     size:[window.innerWidth,window.innerHeight] 
    };
    onResize = ()=>{
      this.setState({
        size:[window.innerWidth,window.innerHeight]
      });
    }
    componentDidMount(){

      window.addEventListener("resize",this.onResize);

    }
    componentWillUnmount(){
      window.removeEventListener("resize",this.onResize);
    }



    render() {

      return <Child size={this.state.size}/>;
    }
    
  }
}

class Foo extends React.Component{
  render(){

    const [width,height] = this.props.size;
    return (
      <div>
        {width} x {height}
      </div>
    );
  }
}
const WrapperedFoo = resizable(Foo);  // 包装类

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

Hook方式

import React, { useState,useEffect  } from "react";

export default function Foo(){
  const [size, setSize] = useState( [window.innerWidth,window.innerHeight] );
  
  onResize = ()=>{
    setSize([window.innerWidth,window.innerHeight]);

  };
  useEffect(() => {
    window.addEventListener("resize",this.onResize);
    document.title=size.join("x");
    return ()=>window.removeEventListener("resize",this.onResize);
  });
 
  const [width,height] = size;
    return (
      <div>
        {width} x {height}
      </div>
    );
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值