返回顶部
首页 > 资讯 > 精选 >antd4里table滚动如何实现
  • 754
分享到

antd4里table滚动如何实现

2023-07-05 08:07:56 754人浏览 八月长安
摘要

本篇内容主要讲解“antd4里table滚动如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“antd4里table滚动如何实现”吧!首先antd4的table的底层实现是rc-table,

本篇内容主要讲解“antd4里table滚动如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“antd4里table滚动如何实现”吧!

首先antd4的table的底层实现是rc-table,就从rc-table来看看。

一、rc-table里Header、Footer、TableBody实现保持同频滚动的方法

场景:Table内容区域大于容器Table宽度,并且Table设置了scrollX,Header、Footer都有, 才关注同频滚动

那么是如何实现的?

  • 监听onScroll方法获取到滚动条向左的滚动的距离scrollLeft;

  • 同时给三个dom设置scrollLeft

二、 rc-table里的onScroll实现

先看一般的onScroll实现

  • 监听onScroll获取scrollLeft

  • 设置header、footer、tableBody的scrollLeft

下面是伪代码哈

const onScroll = (e: ScrollEvent) => {    // 拿到scrollLeft    const scrollLeft = e.target.scrollLeft    // 给所有的header、footer、table-body设置scrollLeft    header.scrollLeft = scrollLeft    footer.scrollLeft = scrollLeft    tableBody.scrollLeft = scrollLeft}

源码里onScroll的实现

 const onScroll = ({    currentTarget,    scrollLeft,  }: {    currentTarget: htmlElement;    scrollLeft?: number;  }) => {    const mergedScrollLeft = typeof scrollLeft === 'number' ? scrollLeft : currentTarget.scrollLeft;    const compareTarget = currentTarget || EMPTY_SCROLL_TARGET;     if (!getScrollTarget() || getScrollTarget() === compareTarget) {       setScrollTarget(compareTarget);      //一个 滚动需要 控制 header、body、summary、stickyScrollBar所有同步滚动            // header设置scrollLeft            scrollHeaderRef.current = mergedScrollLeft            // body 设置scrollLeft            scrollBodyRef.current = mergedScrollLeft    }  };

对比两个的实现,可以看到rc-table里的实现多了一个入参scrollLeft和一个if判断;
为什么多了一个入参、一个判断?继续往下看?

三、 Header、Footer的滚动监听

  • 用组件FixedHolder实现,给FixedHolder绑定ref;

  • 监听的是onWheel, 不是onScroll;

为什么监听onWheel不是onScroll?

React.useEffect(() => {      function onWheel(e: WheelEvent) {        // deltaX: Returns a double representing the horizontal scroll amount        const { currentTarget, deltaX } = e as unknown as React.WheelEvent<HTMLDivElement>;        // 避免触发不必要滚动, 是一种优化        if (deltaX) {          onScroll({ currentTarget, scrollLeft: currentTarget.scrollLeft + deltaX });          e.preventDefault();        }      }      fixHolder.current?.addEventListener('wheel', onWheel);      return () => {        fixHolder.current?.removeEventListener('wheel', onWheel);      };    }, []);

不要将 onscroll 与 onwheel混淆。onwheel 是鼠标滚轮旋转,而 onscroll 处理的是对象内部内容区的滚动事件。
当dom满足下面任意一条的时候,不会触发onScroll;

  • overflow:hidden

  • 滚动条不存在

FixHolder组件

设置了样式overflow:hidden;

<div        style={{          overflow: 'hidden',          ...(isSticky ? { top: stickyTopOffset, bottom: stickyBottomOffset } : {}),        }}        ref={setScrollRef}        className={classNames(className, {          [stickyClassName]: !!stickyClassName,        })}                />                <table          style={{            tableLayout: 'fixed',            visibility: noData || mergedColumnWidth ? null : 'hidden',          }}        >          {(!noData || !maxContentScroll || allFlattenColumnsWithWidth) && (            <ColGroup              colWidths={mergedColumnWidth ? [...mergedColumnWidth, combinationScrollBarSize] : []}              columCount={columCount + 1}              columns={flattenColumnsWithScrollbar}            />          )}          {children({            ...props,            stickyOffsets: headerStickyOffsets,            columns: columnsWithScrollbar,            flattenColumns: flattenColumnsWithScrollbar,          })}        </table>                </div>

通过ref,调用useCallback赋值dom;利用scrollRef.current监听wheel事件,转成onScroll,增加入参scrollLeft;

const setScrollRef = React.useCallback((element: HTMLElement) => {      scrollRef.current = element;    }, []);

四、TableBody的滚动

当然是监听onScroll事件;
给Tables设置scrollX的情况下,TableBody设置样式{overflow-x: auto}这样会有同频滚动

<div  style={    ...scrollXStyle,    ...scrollYStyle  }          onScroll={onScroll}          ref={scrollBodyRef}        >          <TableComponent>            {bodyColGroup}            {bodyTable}          </TableComponent>        </div>

五、很nice的点

获得当前正在执行的dom

const [setScrollTarget, getScrollTarget] = useTimeoutLock(null);

getScrollTarget用来获得当前正在执行的dom
使用useState来存储正在执行的dom; 当组件重新渲染,dom更新,此时正在执行的dom,在下一个render的时候,就变了;useRef在下一次渲染之前不重新赋值,还是保留和上一次一样的值;
源码里使用useRef + setTimeout实现;useRef是用来存放当前正在执行的dom;setTimeout用来节流;
其中getState获取正在执行当前state,可能是空的;setState设置当前的State,并且在100ms以后清空设置的状态;

export function useTimeoutLock<State>(defaultState?: State): [(state: State) => void, () => State | null] {  const frameRef = useRef<State | null>(defaultState || null);  const timeoutRef = useRef<number>();  function cleanUp() {    window.clearTimeout(timeoutRef.current);  }  function setState(newState: State) {    frameRef.current = newState;        // 清空上一次的定时器    cleanUp();        timeoutRef.current = window.setTimeout(() => {      frameRef.current = null;      timeoutRef.current = undefined;    }, 100);  }  function getState() {    return frameRef.current;  }  useEffect(() => cleanUp, []);  return [setState, getState];}

onScroll为什么设置if判断

getScrollTarget()调用onScroll的之前,是否有滚动的dom; 没有就更新;有,判断是否和触发onScroll是相同Dom;是,更新;目的是为了避免执行上一个onScroll的时候,下一个onScroll执行,陷入循环,就相当于节流了;hooks版本的节流

const compareTarget = currentTarget || EMPTY_SCROLL_TARGET; // 固定滚动项// 在处理上一个滚动的时候,禁止下一个也滚动执行onScrollif (!getScrollTarget() || getScrollTarget() === compareTarget) {    setScrollTarget(compareTarget);}

看这块逻辑的时候,优化细节;从hooks的角度,实现节流;wheel和scroll都是滚动,但是也有区别;并且在react里支持dom绑定onScroll、onWheel。

到此,相信大家对“antd4里table滚动如何实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: antd4里table滚动如何实现

本文链接: https://lsjlt.com/news/350519.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • antd4里table滚动如何实现
    本篇内容主要讲解“antd4里table滚动如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“antd4里table滚动如何实现”吧!首先antd4的table的底层实现是rc-table,...
    99+
    2023-07-05
  • antd4里table滚动的实现
    目录一、rc-table里Header、Footer、TableBody实现保持同频滚动的方法二、 rc-table里的onScroll实现三、 Header、Footer的滚动监听...
    99+
    2023-03-02
    antd4 table滚动 antd4 滚动
  • Html中如何实现table数据自动滚动
    这篇文章将为大家详细讲解有关Html中如何实现table数据自动滚动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   Html实现table数据自动滚动的方法:首先写...
    99+
    2024-04-02
  • 如何在Html中实现table数据自动滚动
    这期内容当中小编将会给大家带来有关如何在Html中实现table数据自动滚动,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签....
    99+
    2023-06-06
  • 如何使用CSS实现无滚动条滚动
    小编给大家分享一下如何使用CSS实现无滚动条滚动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一种:伪对象选择器在webkit内核的浏览器里可以定义滚动条样式。...
    99+
    2023-06-08
  • bootstrap如何实现滚动条
    本篇内容介绍了“bootstrap如何实现滚动条”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • react如何实现滚动条
    这篇“react如何实现滚动条”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“react如何实现滚动条”文章吧。react实现...
    99+
    2023-07-04
  • Android嵌套滚动与协调滚动如何实现
    本文小编为大家详细介绍“Android嵌套滚动与协调滚动如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android嵌套滚动与协调滚动如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Coord...
    99+
    2023-07-02
  • 移动端如何实现内滚动
    这篇文章主要为大家展示了“移动端如何实现内滚动”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“移动端如何实现内滚动”这篇文章吧。发现需求如果在一个区域内只允许部分区域产生滚动的效果,而其余部分不能...
    99+
    2023-06-08
  • 如何监听element-ui table滚动事件
    这篇文章主要为大家展示了“如何监听element-ui table滚动事件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何监听element-ui table...
    99+
    2024-04-02
  • antd table怎么实现长表格出现滚动条
    本篇内容主要讲解“antd table怎么实现长表格出现滚动条”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“antd table怎么实现长表格出现滚动条”吧!代码如下:&nb...
    99+
    2023-07-02
  • vue.js el-table虚拟滚动效果怎么实现
    今天小编给大家分享一下vue.js el-table虚拟滚动效果怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-04
  • vue监听滚动事件如何实现滚动监听
    这篇文章主要为大家展示了“vue监听滚动事件如何实现滚动监听”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue监听滚动事件如何实现滚动监听”这篇文章吧。在vu...
    99+
    2024-04-02
  • Javascript如何实现字幕滚动
    小编给大家分享一下Javascript如何实现字幕滚动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Javascript实现字幕...
    99+
    2024-04-02
  • jQuery如何实现滚动效果
    这篇文章主要介绍了jQuery如何实现滚动效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 图片轮播:原理如下: 假设有三张图片,三张...
    99+
    2024-04-02
  • jquery.mobile如何实现手机滚动
    小编给大家分享一下jquery.mobile如何实现手机滚动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!<!-- <...
    99+
    2024-04-02
  • vuejs如何实现文字滚动
    这篇文章主要介绍“vuejs如何实现文字滚动”,在日常操作中,相信很多人在vuejs如何实现文字滚动问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vuejs如何实现文字滚动”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • css如何实现滚动效果
    本篇内容主要讲解“css如何实现滚动效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css如何实现滚动效果”吧!css通过overflow属性设置滚动条示例:<html><h...
    99+
    2023-07-04
  • 如何实现横向滚动条
    今天就跟大家聊聊有关如何实现横向滚动条,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。html:<div class="nav_wrap">&...
    99+
    2023-06-08
  • Android滚动截屏如何实现
    要实现Android滚动截屏,可以使用以下步骤:1. 获取屏幕的宽度和高度。可以通过以下代码获取:```DisplayMetrics...
    99+
    2023-08-24
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作