亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

React-實(shí)現(xiàn)上拉加載更多

avwu / 3276人閱讀

摘要:光判斷滑到最底部是不夠的,首先需要知道用戶現(xiàn)在的操作,是點(diǎn)擊還是滑動(dòng)向上向下向左向右這里受到了原生判斷手指滑動(dòng)方向的啟發(fā)。最近想找圖片縮放的插件,感覺(jué)也跟觸摸事件有關(guān),可以研究一下。

1. 寫(xiě)在前面
我最開(kāi)始糾結(jié)當(dāng)用戶滑動(dòng)時(shí)onTouchMove事件會(huì)不停的執(zhí)行去調(diào)接口,于是我僥幸的想只用onTouchEnd事件去判
斷用戶是否滑到最底部,但是這種方法應(yīng)用到項(xiàng)目中才發(fā)現(xiàn)點(diǎn)擊的時(shí)候也會(huì)觸發(fā)onTouchEnd,實(shí)際應(yīng)用并不理想。
光判斷滑到最底部是不夠的,首先需要知道用戶現(xiàn)在的操作,是點(diǎn)擊還是滑動(dòng)(向上、向下、向左、向右),這里
受到了[原生js判斷手指滑動(dòng)方向][1]的啟發(fā)。

2. demo
class demo Component {
     constructor(props) {
        super(props);
        this.state = {
            finished: false,//是否全部加載完畢
            isFoot: true,   //阻止用戶頻繁上拉調(diào)接口
        }
        this._page = 1;              //分頁(yè)頁(yè)碼                           
        this.val = "";               //搜索框的值
        this._page_size = 5;         //每頁(yè)顯示個(gè)數(shù) 
        this.startx;                 //觸摸起始點(diǎn)x軸坐標(biāo)
        this.starty;                 //觸摸起始點(diǎn)y軸坐標(biāo) 
    }
    //接觸屏幕
    touchStart(e) {
        this.startx = e.touches[0].pageX;
        this.starty = e.touches[0].pageY;
    }
    //離開(kāi)屏幕([e.changedTouches][2])
    touchEnd(e) {
        let endx, endy;
        endx = e.changedTouches[0].pageX;
        endy = e.changedTouches[0].pageY;
        let direction = this.getDirection(this.startx, this.starty, endx, endy);
        switch (direction) {
            case 0:
                console.log("未滑動(dòng)!");
                break;
            case 1:
                console.log("向上!");
                this.loadData();
                break;
            case 2:
                console.log("向下!");
                break;
            case 3:
                console.log("向左!");
                break;
            case 4:
                console.log("向右!");
                break;
            default:
        }
    }
    //觸摸點(diǎn)和離開(kāi)點(diǎn)連線與[x軸角度][3]
    getAngle(angx,angy) {
        return Math.atan2(angy, angx) * 180 / Math.PI;
    }
    //根據(jù)接觸和離開(kāi)判斷方向 1向上 2向下 3向左 4向右 0未發(fā)生滑動(dòng)([Math.abs][4])
    getDirection(startx, starty, endx, endy) {
        let angx = endx - startx;
        let angy = endy - starty;
        let result = 0;

         //如果滑動(dòng)距離太短
         if (Math.abs(angx) < 2 && Math.abs(angy) < 2) {
            return result;
        }
        let angle = this.getAngle(angx, angy);
        if (angle >= -135 && angle <= -45) {
            result = 1;
        } else if (angle > 45 && angle < 135) {
            result = 2;
        } else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
            result = 3;
        } else if (angle >= -45 && angle <= 45) {
            result = 4;
        }
 
        return result;
    }
    //**向上滑動(dòng)時(shí)(在這里才真正的判斷是否到最底部)**
    loadData() {
        console.log("數(shù)據(jù)的高-------------------------", this.refs.onPullUp.clientHeight);
        console.log("滾動(dòng)的高------------------------", document.documentElement.scrollTop);
        console.log("滾動(dòng)的高------------------------", document.body.scrollTop);
        console.log("屏幕的高------------------------", document.documentElement.clientHeight);
        let { meActs } = this.props;
        let dataHeight = this.refs.onPullUp.clientHeight;
        let scrollHeight = document.body.scrollTop || document.documentElement.scrollTop;
        let screenHeight = document.documentElement.clientHeight;
        const h = 10;//自定義距離底部多少時(shí)concat數(shù)據(jù)
        if (dataHeight - scrollHeight - h < screenHeight && this.state.isFoot) {
            this.setState({
                isFoot: false,
            });
            console.log("應(yīng)該只顯示1次");
            let params = {
                value: this.val,
                page_index: this._page,
                page_size: this._page_size,
            }
            meActs.getRecentReadList(this.accessKey, this.accessID, params).then((res) => {
                if (res.data.code === 10000 && res.data.data.list.length > 0) {
                    this.setState({
                        isFoot: true,
                    });
                    this._page++;
                }
                //數(shù)據(jù)加載完畢
                if (res.data.code === 10000 && res.data.data.list.length == 0) {
                    this.setState({
                        finished: true,
                    })
                }
            });
        }
    }
    
    render() {
        return(
             
{listItems}
{ this.state.finished ? 我是有底線的 : recentReadList.list.length > 0 ? this.state.isFoot ? 上拉加載更多 : : 暫無(wú)信息 }
) } }
3. 兼容性
微信端ios 安卓暫時(shí)還未發(fā)現(xiàn)任何異常(已上線的項(xiàng)目) 

4. 結(jié)語(yǔ)
移動(dòng)端觸摸事件的用處遠(yuǎn)不止如此,這次是因?yàn)閍ntd自帶的上拉加載插件在自身項(xiàng)目中應(yīng)用太復(fù)雜所以決定自己
寫(xiě)一個(gè)滿足自身項(xiàng)目需求的代碼少兼容性還看得過(guò)去的就行。最近想找react圖片縮放的插件,感覺(jué)也跟觸摸事件
有關(guān),可以研究一下。

**

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/92302.html

相關(guān)文章

  • 復(fù)雜type頁(yè)面封裝庫(kù),支持多種狀態(tài)切換和下拉刷新拉加

    摘要:支持復(fù)雜頁(yè)面,例如添加自定義頭部和底部布局,支持橫向滑動(dòng),還可以支持粘貼頭部類似微信好友分組,支持不規(guī)則瀑布流效果,支持側(cè)滑刪除功能。十分方便實(shí)現(xiàn)復(fù)雜的布局頁(yè)面,結(jié)構(gòu)上層次分明,便于維護(hù)。 目錄介紹 1.復(fù)雜頁(yè)面庫(kù)介紹 2.本庫(kù)優(yōu)勢(shì)亮點(diǎn) 2.1 支持多種狀態(tài)切換管理 2.2 支持添加多個(gè)header和footer 2.3 支持側(cè)滑功能和拖拽移動(dòng) 2.4 其他亮點(diǎn)介紹 3.如...

    Karrdy 評(píng)論0 收藏0
  • RecyclerView封裝庫(kù)和綜合案例【包含25篇博客】

    摘要:支持復(fù)雜頁(yè)面,例如添加自定義頭部和底部布局,支持橫向滑動(dòng),還可以支持粘貼頭部類似微信好友分組,支持不規(guī)則瀑布流效果,支持側(cè)滑刪除功能。支持粘貼頭部的需求效果,這種效果類似微信好友分組的那種功能界面。 目錄介紹 1.復(fù)雜頁(yè)面庫(kù)介紹 2.本庫(kù)優(yōu)勢(shì)亮點(diǎn) 2.1 支持多種狀態(tài)切換管理 2.2 支持添加多個(gè)header和footer 2.3 支持側(cè)滑功能和拖拽移動(dòng) 2.4 其他亮點(diǎn)介紹 ...

    silenceboy 評(píng)論0 收藏0
  • webpack+vue+mint-ui 實(shí)現(xiàn)拉加更多(Loadmore組件)

    摘要:因?yàn)闃I(yè)務(wù)的需要界面需要實(shí)現(xiàn)分頁(yè)的功能,所以我就研究了一下如何利用自帶的組件實(shí)現(xiàn)上拉加載更多功能。代碼如下上拉加載更多初始化方法如下下面便是上拉加載更多的方法這樣就大功告成啦 因?yàn)闃I(yè)務(wù)的需要界面需要實(shí)現(xiàn)分頁(yè)的功能,所以我就研究了一下如何利用mint-ui自帶的loadmore組件實(shí)現(xiàn)上拉加載更多功能。 首先在文件中引入組件 import {Indicator, Loadmore} f...

    LiuZh 評(píng)論0 收藏0
  • Vue+Better-Scroll 實(shí)現(xiàn)多Tab拉加更多實(shí)例

    摘要:本場(chǎng)是講一個(gè)基于實(shí)現(xiàn)多切換上拉加載更多的實(shí)例,像這種多切換加載更多的場(chǎng)景,不管在端還是移動(dòng)端都還挺常見(jiàn)的,比如商城類,訂單中心等。通過(guò)學(xué)習(xí)本項(xiàng)目,你也可以做出多切換上拉加載更多的效果,而不必到處找別人的例子。 本場(chǎng) Chat 是講一個(gè)基于 Vue+Better-Scroll 實(shí)現(xiàn)多 Tab 切換上拉加載更多的實(shí)例,像這種多 Tab 切換加載更多的場(chǎng)景,不管在 PC 端還是移動(dòng)端都還挺常...

    wuyangchun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<