react component Align 组件分析

代码仓库

1. 正文

基于上次所分析的 dom-align 源码,现在看一下该代码如何被封装成React组件。

1.1 调用方式

<Align
  ref={this.alignRef}
  target={this.getTarget}
  monitorWindowResize={this.state.monitor}
  align={this.state.align}
>
  <div
    style={{
      position: 'absolute',
      width: 50,
      height: 50,
      background: 'yellow',
    }}
  />
</Align>

其中this.alignRef是为了在当前父组件中调用Align组件的强制对齐方法,this.$align.forceAlign();

target即为dom-align中的target,可以是一个函数返回DOM节点。

monitorWindowResize表示是否监听window的变化。

1.2 实现

在初始化时会进行一次对齐,之后在 didUpdate 之后再根据情况对齐

1.3 父组件中通过props.children渲染子组件时,如何获取子组件的ref

在刚刚的源码中,是通过findDomNode查找到的子元素DOM实例,然而官方文档又说大多数情况下,你可以绑定一个 ref 到 DOM 节点上,可以完全避免使用 findDOMNode. 那这种通过this.props.children的情况,能不能通过ref获取到实例呢?

https://stackoverflow.com/questions/52209204/is-it-possible-to-get-ref-of-props-children

父组件:

1.4 buffer 与 addEventListener

刚刚源码中有这两个方法,buffer用于节流控制,即传统的多次触发则清除上一个定时器的做法,可以参考下:

addEventListener仓库地址

该方法屏蔽了event事件对象以及给DOM添加事件方法上,各浏览器实现不一致的问题:

在 IE6-8 中,事件模型与标准不同。使用非标准的 element.attachEvent() 方法绑定事件监听器。在该模型中,事件对象有一个 srcElement 属性,等价于target 属性。

即这个库即使在IE6-8中也可以使用e.target,其内部会处理成srcElemnt

另外需要注意的是,该方法通过闭包的方式,返回一个remove方法,因此即使callback是匿名函数,也是能被移除的。

Last updated

Was this helpful?