第三方包

俗称是第三方包, 其实是 antd 的底层一些基础包

addEventListener

源码: 参考 根据源码所示 支持传递自定义执行函数, 也可以使用默认的函数, 共有四个参数

  • **target**: 监听事件的目标元素
  • **eventType**: 监听事件的类型
  • **callback**: 事件执行时的回调函数
  • **options**: 是否冒泡

因为监听事件的逻辑是依赖于 **dom** 节点的, 所以前期一定要获取到 React 中对应的真实 **DOM** 节点才可以执行, 再者在源码中出现了 unstable_batchedUpdates<**可以参考 [Batch Update 浅析](https://zhuanlan.zhihu.com/p/28532725)>(可以理解为是一个批量更新的钩子, 现在的问题是不稳定的钩子, 后续可能会被移除掉),返回的是一个包含有移除监听事件方法的对象**

  1. import ReactDOM from 'react-dom';
  2. export default function addEventListenerWrap(target, eventType, cb, option) {
  3. /* 包含回调函数及批量更新钩子的处理 */
  4. const callback = ReactDOM.unstable_batchedUpdates
  5. ? function run(e) {
  6. ReactDOM.unstable_batchedUpdates(cb, e);
  7. }
  8. : cb;
  9. // 对 Dom 节点进行事件监听注册
  10. if (target.addEventListener) {
  11. target.addEventListener(eventType, callback, option);
  12. }
  13. // 返回一个可以移除事件监听的处理方法
  14. return {
  15. remove: () => {
  16. if (target.removeEventListener) {
  17. target.removeEventListener(eventType, callback);
  18. }
  19. },
  20. };
  21. }

rc-animate

工具

getScroll

  1. export function isWindow(obj: any) {
  2. return obj !== null && obj !== undefined && obj === obj.window;
  3. }
  4. export default function getScroll(
  5. target: HTMLElement | Window | Document | null,
  6. top: boolean,
  7. ): number {
  8. if (typeof window === 'undefined') {
  9. return 0;
  10. }
  11. const method = top ? 'scrollTop' : 'scrollLeft';
  12. let result = 0;
  13. if (isWindow(target)) {
  14. result = (target as Window)[top ? 'pageYOffset' : 'pageXOffset'];
  15. } else if (target instanceof Document) {
  16. result = target.documentElement[method];
  17. } else if (target) {
  18. result = (target as HTMLElement)[method];
  19. }
  20. if (target && !isWindow(target) && typeof result !== 'number') {
  21. result = ((target as HTMLElement).ownerDocument || (target as Document)).documentElement[
  22. method
  23. ];
  24. }
  25. return result;
  26. }

scrollTo