原生js如何实现上拉加载与下拉刷新?

下拉刷新

首先,在页面顶部添加一个下拉刷新的区域,然后监听touchstart、touchmove和touchend等事件、当用户在下拉刷新区域进行下拉操作时,触发touchmove事件,并判断下拉的距离是否超过一定阈值。如果超过阈值,则触发下拉刷新操作,更新数据并重新渲染页面。

上拉加载

上拉加载的实现方式与下拉刷新类似,也是通过监听滚动事件,并判断滚动到底部触发相应的操作

使用antd-mobile分别实现上拉加载下拉刷新的效果:

下拉刷新效果代码:

HTML代码:

<>
    <List>
        {data.map((item, index) => (<List.Item key={index}>{item}</List.Item>))}
    </List>
    <InfiniteScroll loadMore={loadMore} hasMore={hasMore} threshold={200}>
        <InfiniteScrollContent hasMore={hasMore} />
    </InfiniteScroll>
</>

JS代码:

import React, { useState } from 'react';
import { InfiniteScroll, List, DotLoading } from 'antd-mobile';
import { sleep } from 'antd-mobile/es/utils/sleep'

const result = [
    { id: 1, name: '展示1', status: true },
    { id: 2, name: '展示2', status: true },
    { id: 3, name: '展示3', status: true },
    { id: 4, name: '展示4', status: true },
    { id: 5, name: '展示5', status: true },
    { id: 6, name: '展示6', status: true },
    { id: 8, name: '展示8', status: true },
    { id: 9, name: '展示9', status: true },
    { id: 10, name: '展示10', status: true },
    { id: 11, name: '展示11', status: true },
    { id: 12, name: '展示12', status: true },
    { id: 13, name: '展示13', status: true },
    { id: 14, name: '展示14', status: true },
    { id: 15, name: '展示15', status: true },
    { id: 1, name: '展示1', status: true },
    { id: 2, name: '展示2', status: true },
    { id: 3, name: '展示3', status: true },
    { id: 4, name: '展示4', status: true },
    { id: 5, name: '展示5', status: true },
    { id: 6, name: '展示6', status: true },
    { id: 8, name: '展示8', status: true },
    { id: 9, name: '展示9', status: true },
    { id: 10, name: '展示10', status: true },
    { id: 11, name: '展示11', status: true },
    { id: 12, name: '展示12', status: true },
    { id: 13, name: '展示13', status: true },
    { id: 14, name: '展示14', status: true },
    { id: 15, name: '展示15', status: true },
]

let count = 0

async function mockRequest() {
    if (count >= (result.length) / 2) {
        return []
    }
    await sleep(2000)
    count++
    let arr = []
    result.splice(0, 5).map(i => {
        arr.push(i.name)
    })
    return arr

}
const InfiniteScrollContent = ({ hasMore }) => {
    return (<>
        {hasMore ? (<>
            <span>Loading</span>
            <DotLoading />
        </>) : (<span>--- 我是有底线的 ---</span>)}
    </>);
};
export default () => {
    const [data, setData] = useState([]);
    const [hasMore, setHasMore] = useState(true);
    async function loadMore() {
        const append = await mockRequest();
        setData(val => [...val, ...append]);
        setHasMore(append.length > 0);
    }
    return (

    );
};

效果如下:

上拉加载效果代码:

HTML代码:

<PullToRefresh onRefresh={async () => {
        await sleep(1000);
        setData([...getNextData(), ...data]);
    }} renderText={status => {
        return <div>{statusRecord[status]}</div>;
    }}>
        <List style={{ minHeight: '100vh' }}>
            {data.map((item, index) => (<List.Item key={index}>{item}</List.Item>))}
        </List>
</PullToRefresh>

JS代码:

import React, { useState } from 'react';
import { PullToRefresh, List } from 'antd-mobile';
import { sleep } from 'antd-mobile/es/utils/sleep';
import { LoremIpsum } from 'lorem-ipsum'

const lorem = new LoremIpsum({
    sentencesPerParagraph: {
        max: 8,
        min: 4,
    },
    wordsPerSentence: {
        max: 16,
        min: 4,
    },
})

function getNextData() {
    const ret = [];
    for (let i = 0; i < 18; i++) {
        ret.unshift(lorem.generateWords(1));
    }
    return ret;
}
const statusRecord = {
    pulling: '用力拉',
    canRelease: '松开吧',
    refreshing: '玩命加载中...',
    complete: '好啦',
};
export default () => {
    const [data, setData] = useState(() => getNextData());
    return (

    );
};

效果如下:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值