iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Modern Web

轉行猴子碰碰車:網站開發一口酥系列 第 3

關於 let 狀態管理的那些事

  • 分享至 

  • xImage
  •  

關於狀態管理的應用,在原生 JS 中最有趣的、也必要的,應該就是 isEventRunning 的 true/false 了。
我們可以在初始創建一個 let 變數,
用來避免在執行某個事件偵測時,重複呼叫造成的麻煩,如卡頓、非預期行為等等。

let isLoading = false;

例如最經典的 IntersectionObserver API,我們可以搭配並設定若在特定 Enry 位置向下捲動,就會更新新的資料。

function setupObserver() {
    return new IntersectionObserver(handleIntersection, {});
}
function handleIntersection(entries) {
    entries.forEach((entry) => {
        if (entry.isIntersecting &&
            !isLoading 
        ) {
            observer.unobserve(entry.target);
            fetchData();
        }
    });
}

如果已經觸發到了 Entry 點,且沒有 isLoading (!isLoading 相當於 isLoading = false)
就會去 fetch 資料進而渲染到畫面上。

async function fetchData() {
    if (isLoading) return;
    isLoading = true;
    
    // 做 fetch 該做的事情
    
    // 渲染到畫面上
    
    isLoading =false
}catch(error){
    console.log("Error Fetching data:", error);
    
    isLoading = false
}

只有在 fetchData 的時候,暫時將 isLoading 設定為 true,直到整個 Promise 完成(結束或發生錯誤),只有在 fetch 的時候會轉為 true。
如果 isLoading = true (亦即在程式語言中,存在),就跳出函式。

簡單的一個布林變數,就能避免事件重複觸發。
同理,我們也可以在其他事件中這樣做:

async function arrowMotion(imageCount) {
    let isScrolling = false;
    
    imagesWrapper.addEventListener("scroll", function (e) {
    
    leftArrowButton.addEventListener("click", function () {
        if (isScrolling) return;
        isScrolling = true;
        
        // 移動到指定位置
        
        isScrolling = false;
    }
    rightArrowButton {...}
 }

在滾動事件中,加入 isScrolling 布林變數,只要還在捲動就不能觸發,就不會在捲動卷軸還沒到指定位置前、就重複觸發、抽搐或沒算到想要的移動數職啦!


上一篇
JavaScript 定義:var 怎麼還在啊?
下一篇
今天來聊聊 Styleguide
系列文
轉行猴子碰碰車:網站開發一口酥4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言