亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue長列表數據刷新怎么實現

發布時間:2023-04-20 09:41:02 來源:億速云 閱讀:123 作者:iii 欄目:開發技術

本篇內容介紹了“vue長列表數據刷新怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、效果展示

兩列均為局部可視范圍內數據刷新

vue長列表數據刷新怎么實現

二、代碼

實現的主要思路:

1、提前保留可視div的高度,計算出可視高度能填滿情況下最少的單元格條數;

2、根據提供的每個單元格高度和總數據條數計算出總的可滑動div高度,使其可以滑動;

3、在上述可滑動div內部再包裹一層div,此節點的作用就是在滑動過程中,改變自身的 top 值,使之在父節點滑動中始終出現在父節點的可視區域內。

4、根據滑動的距離更新vue數據,但是也只是更新能填滿可視區域最小條數。

<div class="main">
    <div v-for="(dom) in longListEl" :key="dom.id" class="longList">
        <div :id="dom.id" class="contain">
            <div >
                <div : v-for="(item,index) in dom.data" :key="item.id">
                    {{ item.title }}
                </div>
            </div>
        </div>
    </div>
</div>
export default {
    data() {
        return {
            longListData:[],
            expectationCellHeight:40,
            longListEl:[{id:'contain',data:[]},{id:'contain1',data:[]}],
            longListDataManages:[]
        };
    },
    mounted() {
        for(let index = 0;index < 250000;index ++){
            this.longListData.push({id:index,title:('我是第' + index + '個')})
        }
        this.$nextTick(()=>{
            this.longListEl.forEach((dom)=>{
                let containEl = document.getElementById(dom.id)
                if(containEl){
                    this.longListDataManages.push(new LongListDataManage(containEl,this.longListData,this.expectationCellHeight,(data)=>{
                        dom.data = data
                    }))
                }
            })
        })
    },
    methods: {
    },
};
function LongListDataManage(el,totalData,expectationCellHeight,refreshDataCallBack){
    this.el = el//需要操作的dom
    this.startIndex = 0//數據源的開始索引
    this.endIndex = 0//數據源的結束索引
    this.containElHeight = el ? el.offsetHeight : 0//可視區域高度
    this.totalData = totalData//全部數據源
    this.refreshDataCallBack = refreshDataCallBack//數據刷新回調
    this.expectationCellHeight = expectationCellHeight//預期的單元cell高度
    this.expectationCellFullScreenNum = 0//預期可視區域展示的單元條數
    this.expectationTotalHeight = 0//預期滑動的最大高度
    this.scrollTop = 0//當前滾動距離
    this.beginRefreshDataDistance = expectationCellHeight//滑動觸發刷新數據最小距離,這里僅為一個單元格高度
    // 開始填充數據
    this.begin = function(){
        this.initData()
        this.getCurrentShowDatas()
        this.addListenerScroll()
    }
    // 初始化參數
    this.initData = function(){
        //總高度設定
        this.expectationTotalHeight = this.totalData.length * this.expectationCellHeight
        this.el.style.height = this.expectationTotalHeight + 'px'
        //數據源的結束索引設定(向上取整)
        this.endIndex = this.expectationCellFullScreenNum = Math.ceil((this.containElHeight / this.expectationCellHeight) + 0.1)
    }
    // 開始獲取當前需要展示的區間
    this.getCurrentShowDatas = function(){
        //截取數據源開始跟結束節點之間的數據
        let currentData = this.totalData.slice(this.startIndex,this.endIndex)
        //給vue提供數據
        this.refreshDataCallBack(currentData)
    }
    // 監聽滾動
    this.addListenerScroll = function(){
        //父節點
        let parentNode = this.el.parentNode
        //第一個子節點(改變其top值實現始終在父節點的可視區域內)
        let firstChild = this.el.firstChild
        let scrollingEvent = ()=>{
            let scrollTop = parentNode.scrollTop
            //滑動的距離超過規定的閥值或者滑動距離為0進行數據源重置
            if(Math.abs(scrollTop - this.scrollTop) >= this.beginRefreshDataDistance || scrollTop <= 0){
                //更改數據源區間索引
                this.startIndex = Math.ceil(scrollTop / this.expectationCellHeight)
                this.endIndex = this.startIndex + this.expectationCellFullScreenNum
                //上下平移可視區域展示dom,實現屏幕相對位置不變
                firstChild.style.top = scrollTop + 'px'
                //回傳數據源
                this.getCurrentShowDatas()
                this.scrollTop = scrollTop
            }
        }
        //開始監聽滾動
        parentNode.addEventListener("scroll", scrollingEvent)
    }
}

“vue長列表數據刷新怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

大方县| 惠安县| 拉孜县| 简阳市| 平邑县| 江源县| 象州县| 高淳县| 天峨县| 体育| 湾仔区| 广德县| 民乐县| 余江县| 彭山县| 广灵县| 满洲里市| 梁山县| 石城县| 长宁区| 万年县| 苍南县| 莱西市| 志丹县| 甘肃省| 霸州市| 庆城县| 鄂州市| 孟津县| 密山市| 陕西省| 广东省| 临漳县| 南丹县| 封丘县| 泊头市| 改则县| 西乌珠穆沁旗| 烟台市| 海安县| 焦作市|