Affix组件

这个组件是一个图钉组件,使用的fixed布局,让组件固定在窗口的某一个位置上,并且可以在到达指定位置的时候才去固定。

AffixProps

还是老样子,看一个组件首先我们先来看看他可以传入什么参数

  // Affix
  export interface AffixProps {
    /**
    * 距离窗口顶部达到指定偏移量后触发
    */
    offsetTop?: number;
    offset?: number;
    /** 距离窗口底部达到指定偏移量后触发 */
    offsetBottom?: number;
    style?: React.CSSProperties;
    /** 固定状态改变时触发的回调函数 */
    onChange?: (affixed?: boolean) => void;
    /** 设置 Affix 需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数 */
    target?: () => Window | HTMLElement;
    // class样式命名空间,可以定义自己的样式命名
    prefixCls?: string;
  }

Render()

看完传入参数之后,就到入口函数看看这里用到了什么参数

占位元素

接下来是重头戏,从render函数中我们应该看到了,控制当前组件的主要因素是两层div上的style这个属性,那么接下来我们就看看这两个style是如果构造的

从生命周期开始

这个小小的组件却有很多的代码,主要都是在处理状态的代码,乍一看下来很没有头绪,所以就想着从他们的生命周期开始深入了解,然后在生命周期中果然打开了新的世界,渐渐的理清楚了头绪,接下来我将带领大家一同来领略affix组件的风采:

在这个三个生命周期中,我们看见了有这么几个函数,setTargetEventListeners,clearEventListeners,updatePosition, 我们就来看看他们都干了啥吧

三个函数

用到的其他辅助函数

在上面这一块代码中,有几个函数是外部辅助函数,但是却是比较有意思的,因为这些辅助函数需要写的很有复用性才有作用,所以正是我们值得学的地方 getScroll(), throttleByAnimationFrameDecorator装饰器,这两个东西是值得我们学习的,并且我们会一起学习装饰器模式

getScroll()

这个函数主要是获取到传入的dom节点的滚动事件,其中需要讲解的是window.document.documentElement 它可以返回一个当前文档的一个根节点,详情可以查看这里arrow-up-right

throttleByAnimationFrameDecorator装饰器

首先我们需要知道装饰器的语法糖,可以查看这里arrow-up-right

还有typescript装饰器arrow-up-right

接下来我们还需要知道为什么使用装饰器,我这里就是简单的说一下,装饰器模式主要就是为了动态的增减某一个

类的功能而存在的,详情可以查看这里arrow-up-right

补(装饰器中的get以及set解读)

下来之后我自己模拟了一下上面的装饰器,代码如下,并且通过查询一些资料,知道了get和set是在什么时候被调用的

在写装饰器代码的时候需要在tsconfig.json文件中的compilerOptions属性添加一下代码 "experimentalDecorators": true

这个get函数会在类被实例化的时候就进行调用,所以就能够将这些属性赋给外部的target

也就是在this.callDecorator的时候

顺带说一下set函数 会在 this.callDecorator = something 的时候调用

Demo组件

装饰器代码

输顺序结果如图

decorator

完整代码

Last updated