美文网首页
十二、高阶组件、refs、hooks等

十二、高阶组件、refs、hooks等

作者: 懒羊羊3号 | 来源:发表于2019-05-21 10:26 被阅读0次

    高阶组件

    参考
    官网
    https://segmentfault.com/a/1190000010371752

    与父组件区别
    • 高阶组件作为一个函数,它可以更加纯粹地关注业务逻辑层面的代码,比如数据处理,数据校验,发送请求等,可以改善目前代码里业务逻辑和UI逻辑混杂在一起的现状。父组件则是UI层的东西,我们先前经常把一些业务逻辑处理放在父组件里,这样会造成父组件混乱的情况。为了代码进一步解耦,可以考虑使用高阶组件这种模式。

    高阶组件就是一个没有副作用的纯函数。
    1、例子

    import React, { Component } from 'react';
    import simpleHoc from './simple-hoc';
    
    class Usual extends Component {
      render() {
        console.log(this.props, 'props');
        return (
          <div>
            Usual
          </div>
        )
      }
    }
    export default simpleHoc(Usual);
    import React, { Component } from 'react';
    
    const simpleHoc = WrappedComponent => {
      console.log('simpleHoc');
      return class extends Component {
        render() {
          return <WrappedComponent {...this.props}/>
        }
      }
    }
    export default simpleHoc;
    

    可以用装饰器

    import React, { Component } from 'react';
    import simpleHoc from './simple-hoc';
    
    @simpleHoc
    export default class Usual extends Component {
      render() {
        return (
          <div>
            Usual
          </div>
        )
      }
    }
    

    ref获取原始图片尺寸,滚轮放大缩小

    import React from 'react';
    
    class Test extends React.PureComponent {
    
      state = {
        ratio : 1,
        originWidth: 'auto',
        originHeight: 'auto',
      }
    
      componentDidMount() {
        this.getImgSize();
      }
    
      getImgSize = () => {
        console.log(this.imgEl)
        this.setState({
          originWidth: this.imgEl.width,
          originHeight: this.imgEl.height
        })
      }
    
      wheelScale = (e) => {
        let {ratio} = this.state
        e.preventDefault()
        if (e.deltaY < 0) {
          ratio += 0.15
        } else {
          ratio -= 0.15
        }
        this.setState({
          ratio,
        })
      }
    
      render() {
        const url ='http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0.jpg';
        const {ratio} = this.state;
        const {originWidth, originHeight} = this.state;
        return (
          <div style={{height:'500px',width:'500px', overflow:'hidden'}}>
            <img
              src={url}
              width={originWidth*ratio}
              height={originHeight*ratio}
              alt="预览图片"
              onWheel={this.wheelScale}
              ref={(img) => {this.imgEl = img}}
            />
          </div>
        )
      }
    }
    export default Test;
    

    理解

    1、高阶函数传入一个函数或者return一个函数
    2、高阶组件,解决mixin问题
    3、属性代理模式,常用,修改或增加props

    image.png
    4、反向继承
    image.png
    5、静态方法丢失,用hoist-non-react-statics处理
    6、refs不能传递,<Enhancer getRef={ref => this.wrappedC = ref} />

    相关文章

      网友评论

          本文标题:十二、高阶组件、refs、hooks等

          本文链接:https://www.haomeiwen.com/subject/hjjvbqtx.html