美文网首页
react-hooks实现下拉刷新

react-hooks实现下拉刷新

作者: 无缘霸哥 | 来源:发表于2020-03-17 09:28 被阅读0次

    index.js文件

    import React, { useEffect } from 'react';
    import './index.less';
    const PullToRefresh = (props) => {
      //damping 下拉的最大距离
      // onRefresh 为刷新时的回调函数
      // refresh 判断当前的刷新状态
      //children 为该组件包含的内容
      //height 为滚动的区域高度,即超出高度为多少就滚动
      let { damping = 60, onRefresh, refresh, children, height } = props;
      useEffect(() => {
        let list = document.getElementById('list-content-1');
        list.style.height = parseInt(height) + 'px';
        list.style.overflowY = 'auto';
        list.style.overflowX = 'hidden';
      }, [height]);
      useEffect(() => {
        let list = document.getElementById('list-content-1');
        let loading = document.getElementById('loading-1');
        let startY, endY;
        const touchstart = (e) => {
          startY = e.touches[0].pageY;
        };
        const touchmove = (e) => {
          endY = e.touches[0].pageY;
          let diff = startY - endY; // < 0 说明向下移动
          if (diff < 0 && list.scrollTop === 0) {
            loading.innerText = Math.abs(diff) > 40 ? '松手立即刷新' : '下拉可以刷新';
            list.style.transition = 'all 0.3s';
            list.style.marginTop =
              Math.abs(diff) > damping ? damping / 2 + 'px' : Math.abs(diff) / 2 + 'px';
          }
        };
        const touchend = () => {
          let diff = startY - endY;
          if (diff <= -40 && list.scrollTop <= 0) {
            // 只有向下才可以刷新
            if (Math.abs(diff) < damping) {
              list.style.marginTop = Math.abs(diff) / 2 + 'px';
            } else {
              list.style.marginTop = damping / 2 + 'px';
            }
            loading.innerText = '正在刷新';
            onRefresh();
          } else if (0 > diff > -40) {
            // 下拉幅度不够,没有触发下拉刷新
            list.style.marginTop = 0;
          }
        };
        list.addEventListener('touchstart', touchstart);
        list.addEventListener('touchmove', touchmove);
        list.addEventListener('touchend', touchend);
        return () => {
          list.removeEventListener('touchstart', touchstart);
          list.removeEventListener('touchmove', touchmove);
          list.removeEventListener('touchend', touchend);
        };
      }, []);
      useEffect(() => {
        let list = document.getElementById('list-content-1');
        let loading = document.getElementById('loading-1');
        if (refresh) {
          loading.innerText = '刷新完成';
          list.style.marginTop = 0;
          list.style.transition = 'all 0.3s';
        }
      }, [refresh]);
      return (
        <div id="pullToRefresh-1">
          <div id="loading-1" />
          <div id="list-content-1">{children}</div>
        </div>
      );
    };
    
    export default PullToRefresh;
    

    index.less

    #pullToRefresh-1 {
        width: 100%;
        height: 100%;
        background: transparent;
        position: relative;
    }
    
    #loading-1 {
        width: 100%;
        height: 24px;
        display: flex;
        justify-content: center;
        align-items: center;
        position: absolute;
        top: -40px;
        left: 0;
        font-size: 1rem;
        background: transparent;
        color: grey;
        padding-top: 16px;
    }
    #list-content-1 {
        width: 100%;
        height: auto;
    }
    

    quote.jsx 组件引用

    import React, {useState} from 'react';
    import PullToRefresh from "./index";
    
    const Quote = () => {
      // 此处为滚动区域的高度
      const [height, setHeight]  =useState( document.documentElement.clientHeight);
      const onRefresh = () => {
        console.log('刷新时的操作')
      };
      return <PullToRefresh onRefresh={onRefresh} refresh={true /*false*/} height={height}>
        <div>此处为滚动的内容</div>
      </PullToRefresh>
    };
    export default Quote;
    

    这是我基于react-hooks写的一个下拉刷新组件,如果有谁在使用的过程中,发现问题,请麻烦指出。

    相关文章

      网友评论

          本文标题:react-hooks实现下拉刷新

          本文链接:https://www.haomeiwen.com/subject/kdbnehtx.html