首页 > 其他分享 >React - 循环滚动

React - 循环滚动

时间:2023-06-25 17:56:46浏览次数:46  
标签:current 滚动 React 循环 组件 const BoxRef roll

1.准备工作

  let timer = null; // 定时器
  const BoxRef = useRef(); // 父组件ref
  const ChildRef = useRef(); // 子组件ref用于包裹数据循环的
  const [roll, setRoll] = useState(true); // 是否滚动
  // comments是要map的数据

2.开始

  1. 鼠标移入时暂停
  2. 移出时开始
  3. 移入时上下滚动 无缝循环滚动
/**
用做于自动向上循环滚动
**/
useEffect(() => {
    // 使用定时器
    timer = setInterval(() => {
      if (!roll) return;
      // 判断父组件的滚动高度是否大于子组件本身的高度
      // 是的话就回到0 不是即++让他有自动往上移动的效果
      if (BoxRef.current.scrollTop >= ChildRef.current.scrollHeight) {
        BoxRef.current.scrollTo({
          top: 0,
          behavior: 'instant',
        });
      } else {
        BoxRef.current.scrollTo({
          top: BoxRef.current.scrollTop++,
          behavior: 'smooth',
        });
      }
    }, 25);
    return () => {
      // 数据变化就关闭重新开始一个定时器
      clearInterval(timer);
      timer = null;
    };
  }, [comments, roll]);

 

/**
用作于当鼠标放入时监听滚动 来达到上下滚动过都循环的效果
**/
const scrollChange = () => {
    if (roll) return; // 如果当前为允许滚动则跳出
    if (BoxRef.current.scrollTop <= 0) { 
      // 判断父组件滚动的距离是否 向上滚动到0了如果是就跳到子组件的高度
      // 这里减一是怕他执行时被下面的代码再一次执行 导致又回到了0然后导致死循环
      BoxRef.current.scrollTo({
        top: ChildRef.current.scrollHeight - 1, 
        behavior: 'instant',
      });
    } else if (BoxRef.current.scrollTop >= ChildRef.current.scrollHeight) {
      // 判断父组件的滚动的距离是否大于子组件的高度
      // 这里回到1而不是0 也是同上↑
      BoxRef.current.scrollTo({
        top: 1,
        behavior: 'instant',
      });
    }
  };

  useEffect(() => {
    BoxRef.current?.addEventListener('scroll', scrollChange, true);
    return () => {
      BoxRef.current?.removeEventListener('scroll', scrollChange, true);
    };
  }, [roll]);

结构

/**
Test 封装的组件忽略
**/
    <div
        width="match_parent"
        height="wrap_content"
        display="flex"
        flexDirection="column"
        overflow={roll ? 'hidden' : 'auto'}
        ref={BoxRef}
        onm ouseEnter={() => setRoll(false)}
        onm ouseLeave={() => setRoll(true)}
      >
        <div
          width="match_parent"
          height="wrap_content"
          ref={ChildRef}
          display="flex"
          flexDirection="column"
        >
          {comments?.map(comment => (
            <Test
              key={comment.getId()}
              width="match_parent"
              height="wrap_content"
            />
          ))}
        </div>
        <div
          width="match_parent"
          height="wrap_content"
          display="flex"
          flexDirection="column"
        >
          {comments?.map(comment => (
            <Test
              key={comment.id}
              width="match_parent"
              height="wrap_content"
            />
          ))}
        </div>
      </div>

 

标签:current,滚动,React,循环,组件,const,BoxRef,roll
From: https://www.cnblogs.com/Dluea/p/17503574.html

相关文章

  • JS(循环)
    一for循环在程序中,一组被重复执行的语句被称之为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称之为循环语句1语法结构for循环主要用于把某些代码循环若干次,通常跟技术有关系。其语法结构如下for(初始化变量;条件表达式;操作表达式......
  • 关于数字滚动动画的思考
    数字滚动动画的实现思路:方法一:1.设置translate2.设置替换数字方法二: 利用轮播图的实现方法纵向轮播数字最后停留于选定数字方法三:利用innerHTML来直接替换对应内容,加上定时器来循环调用回调函数中写上设定好的数字。方法三(2):innerHTML替换,利用递增来跳到对应的值的时候......
  • 其他——27页面滚动渐入动画
    1.安装动画库;npminstallanimate.css2、在main.js中引入;importanimatefrom"animate.css";3、给对应的模块设置好想要的animate动画类名,通过一个变量控制是否添加/移除该类名,达到重复播放的效果; 4、在mounted中给对应的模块创建监听,控制这个变量,进入区域为true,反之......
  • React基本引入和JSX语法
    1.1React介绍1.1.1.官网英文官网:https://reactjs.org/中文官网:https://react.docschina.org/1.1.2.介绍描述用于动态构建用户界面的JavaScript库(只关注于视图)由Facebook开源1.1.3.React的特点声明式编码组件化编码ReactNative编写原生应用高效(优秀......
  • TensorFlow11.2 循环神经网络RNN-循环神经网络、RNN-layer实现
    循环神经网络SentimentAnalysis(情感分析)类似于淘宝的好评还是差评,我们比较直观的一个方法就是:这里不好的是:Downsides:1.Longsentence100+wordstoomuchparameters[w,b]。就是比如说我们有100个单词,会产生很多个w,b,参数太多了。2.Nocontextinformation(没有语......
  • 提升项目水平的5个React库
    长话短说在本文中,我们将介绍5个库,它们可以解决React开发中一些最常见的痛点(例如数据获取、样式、可访问性和状态管理),从而对您的React开发体验产生积极影响。(更|多优质内|容:java567点c0m) 介绍掌握React的基础知识很重要。事实上,无需大量额外的库,您就可以取得很大的......
  • TensorFlow11.1 循环神经网络RNN01-序列表达方法
    在自然界中除了位置相关的信息(图片)以外,还用一种存在非常广泛的类型,就是时间轴上的数据,比如说序列信号,语音信号,聊天文字。就是有先后顺序。对于下面这个:不如说我们输入有10个句子,每个句子都有4个单词,然后我们怎么把这些句子转化为具体的数值呢。如果一个表示方法能够很好的表示这......
  • create-react-app 除了NODE_ENV如何区分环境变量
    比如webpack打包的时候,可能要打包到测试环境或者生产环境,但是这时候NODE_ENV的值都是production,这个时候如何区分呢。答案是:cross-env和webpack.DefinePlugin1.定义环境变量到编译环境:测试环境: cross-envNODE_STAGE=testnpmrunbuild预上线: cross-envNODE_STAGE=s......
  • 蔚来手撕代码题:三个线程循环打印ABC
    问题如下:https://www.nowcoder.com/discuss/493178141461041152思路分析三个线程交替打印ABC的实现方法有很多,我个人比较倾向于使用JUC下的CyclicBarrier(循环栅栏,也叫循环屏障)来实现,因为循环栅栏天生就是用来实现一轮一轮多线程任务的,它的核心实现思路如下图所示:Cycl......
  • java循环
    whilewhile(){}do{}while();for(;;){}增强for循环for(声明语句:表达式){}publicclasszqfor{  publicstaticvoidmain(String[]args){​    int[]a={10,20,30,40,50};    for(intx:a){      System.out.println(x);   ......