<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
平時我們處理分頁載入時,往往是通過卷軸判斷是否到了容器底部再執行的載入任務的,這樣有一個問題就是,不管卷軸是否劃到底部位置,它都會執行計算這個函數。
那麼,如果能判斷底部的載入區域出現後再去執行載入,不用再做卷軸計算了,這樣豈不美哉。本期將以非同步觀察目標元素的新方式去完成分頁載入業務。
<div id="app" @vue:mounted="mounted" :class="{'active':active}"> <ul> <li v-for="item in num"><span>{{item}}</span> <p></p> </li>' <div class="loading"> <div ref="loading" v-show="!isLoading"></div> loading.. </div> </ul> </div> #app{ display: none; &.active{ display: block; } } ul{ width: 100%; li{ width: 100%; height: 10vh; display: flex; align-items: center; justify-content: start; box-sizing: border-box; padding: 0 3%; position: relative; border-bottom: 1px solid #efefef; font-size: 14px; font-family: fantasy, Courier, monospace; span{ display: inline-block; min-width: 30px; text-align: center; } p{ flex: 1; height: 4vh; background-color: #e2e2e2; margin-left: 3%; } } } .loading{ font-family: fantasy, Courier, monospace; display: flex; height: 15vh; align-items: center; justify-content: center; animation: loading 1s linear infinite; } @keyframes loading{ 0%,100%{ opacity: 1; } 50%{ opacity:0; } } import { createApp } from 'https://unpkg.com/petite-vue?module' createApp({ num: 0, page:1, active:false, observer:null, isLoading:false, mounted() { this.active = true; this.loading = this.$refs.loading; this.observer= new IntersectionObserver(()=>{ this.addNum(); },{ root:window.document, rootMargin:"0px 0px 0px 0px", threshold:0 }) this.observer.observe(this.loading) // this.observer.unobserve(this.loading) }, addNum(){ if(this.isLoading) return; this.isLoading = true; console.log(`loading,page:${this.page}`) setTimeout(()=>{ this.num += 20; this.page ++; this.$nextTick(()=>{ this.isLoading = false; }) },1000) } }).mount()
IntersectionObserver()
對不少小夥伴來說可能是一個比較生疏的構造器,你可以傳入監聽區域,以及監聽後的回撥函數,然後它會建立並返回一個 IntersectionObserver
物件,而這個物件可以來完成監聽某個目標元素是否與該監聽區域發生交叉,每次達到檢查閾值後都會觸發剛才傳入的回撥函數。
// 獲取監聽目標 this.loading = this.$refs.loading; // 用構造器建立監聽區域物件 this.observer= new IntersectionObserver(()=>{ this.addNum(); },{ root:window.document, // 監聽區域,預設為整個可視表單 rootMargin:"0px 0px 0px 0px", // 類似margin,為邊界的偏移量用於判定範圍是否滿足計算需要,預設0px 0px 0px 0px threshold:0 // 閾值(0-1),表示交叉區域的比例值,預設為0 }) // this.observer.observe(this.loading)
根據以上程式碼就可以在業務中,判斷元素是否出現在,只要達到閾值就會觸發回撥,在這個回撥函數中你可以去完成載入列表等操作,從而代替頻繁用計算卷軸的位置距離的困擾。
或許你在嘗試使用非同步觀察目標元素的這個寫法時,會發現一個嚴重的問題,就是可能本想載入一次的任務突然出現兩次請求。這又是為什麼呢?
其實就是因為 threshold
這個閾值,表示著交叉區域的比例值的,當你進入這個觀察區域的時候會觸發,當頁面內容往下填充,會把監聽目標元素往下推,又到達了這個閾值從而又觸發了一次。
解決方案很簡單,就是加一個 isLoading
開關,在請求中的時候,把根據這個開關把監聽目標隱藏掉,等載入渲染結束之後,再顯示出來,就可以解決這個問題了。具體可以看演示的案例哦~
<div class="loading"> <div ref="loading" v-show="!isLoading"></div> loading.. </div>
以非同步觀察目標元素的方式來完成諸如此類的業務比如說分頁載入,觸發動畫,阻止操作等等都是不錯的選擇,而且從相容性來看也可以放心在大多數現代瀏覽器中使用到它。
以上就是非同步觀察目標元素方式完成分頁載入的詳細內容,更多關於非同步觀察目標元素分頁載入的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45