最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react實現(xiàn)阻止父容器滾動

 更新時間:2023年11月14日 10:07:56   作者:天天向上的鹿茸  
這篇文章主要介紹了react實現(xiàn)阻止父容器滾動方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

react阻止父容器滾動

最近在做代碼遷移的時候出現(xiàn)一個問題,發(fā)現(xiàn)之前自己寫好的一個自定義滾動條組件有個bug,那就滾動時父容器也會滾動。

看一下代碼,代碼做了簡化

export default ()=>{
return return (
    <div
      className={classNames(getCls('container'), isDragRef.current ? 'active' : '', className)}
      ref={scrollDOMRef}
      onWheelCapture={(e: any) => {
        e.preventDefault();
        if (e.deltaY < 0) {
          // 向上
          setDragY(dragY - dragSpeed);
        } else {
          // 向下
          setDragY(dragY + dragSpeed);
        }
      }}>
    </div>
  );
}

既然父容器會滾動那就阻止默認行為就好e.preventDefault();,但是沒用。

這里我猜測應該因為react的事件是合成事件的緣故,所有事件都注冊document上,所以導致阻止的默認行為并沒有阻止到父容器上。

那就用原生的唄。

useEffect(() => {
    if (scrollDOMRef.current) {
      scrollDOMRef.current.addEventListener('wheel', (e) => {
        e.preventDefault();
        if (e.deltaY < 0) {
          // 向上
          setDragY(dragY - dragSpeed);
        } else {
          // 向下
          setDragY(dragY + dragSpeed);
        }
      });
    }
  }, [scrollDOMRef.current]);

原生事件和react事件一起用時要注意,阻止冒泡要考慮清楚,因為可能會導致react合成事件失效。

那這么做后就可以了嗎?

確實

父容器不滾動了

但是又掉進了react的閉包陷阱

注冊函數(shù)并沒有及時更新,dragY 和 dragSpeed的閉包導致出現(xiàn)了bug。

那么又應該怎么做呢?

useEffect(() => {
    if (scrollDOMRef.current) {
      scrollDOMRef.current.addEventListener('wheel', (e) => {
        e.preventDefault();
        if (e.deltaY < 0) {
          // 向上
          setDragY(dragY - dragSpeed);
        } else {
          // 向下
          setDragY(dragY + dragSpeed);
        }
      });
    }
  }, [scrollDOMRef.current, dragY, dragSpeed]);

又一個問題出現(xiàn)了

每次應該把之前的事件銷毀,然后在注冊才對。

不然多個事件同時觸發(fā)導致了bug。

useEffect(() => {
    const handle = (e: any) => {
      e.preventDefault();
      if (e.deltaY < 0) {
        // 向上
        setDragY(dragY - dragSpeed);
      } else {
        // 向下
        setDragY(dragY + dragSpeed);
      }
    };
    if (scrollDOMRef.current) {
      scrollDOMRef.current.addEventListener('wheel', handle, {
        passive: false,
      });
    }
    return () => {
      if (scrollDOMRef.current) {
        scrollDOMRef.current.removeEventListener('wheel', handle);
      }
    };
  }, [scrollDOMRef.current, dragY, dragSpeed]);

passive

passive為false時,瀏覽器執(zhí)行完回調函數(shù)才知道有沒有調用preventDefault,如果沒有調用preventDefault,再去執(zhí)行默認行為,就是滾動。這樣就回造成滾動不流暢。

passive為true,就是告訴瀏覽器不會調用preventDefault,瀏覽器直接執(zhí)行滾動就行,不用考慮回調函數(shù)了。

這時,即使你在回調函數(shù)里調用preventDefault也不會生效。

mdn中說,在有些瀏覽器(特別是Chrome和Firefox)中,你監(jiān)聽window、document或者document.body上的touchstart和touchmove,會將passive默認設置為true。

還是要提醒大家,在你不需要調用preventDefault的時候,監(jiān)聽scroll或者touchmove,將passive設置為true

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • react組件實例屬性state詳解

    react組件實例屬性state詳解

    這篇文章主要介紹了react組件實例屬性state,有狀態(tài)state的組件稱作復雜組件,沒有狀態(tài)的組件稱為簡單組件,狀態(tài)里存儲數(shù)據(jù),數(shù)據(jù)的改變驅動頁面的展示,本文結合實例代碼給大家詳細講解,需要的朋友可以參考下
    2023-02-02
  • react+antd.3x實現(xiàn)ip輸入框

    react+antd.3x實現(xiàn)ip輸入框

    這篇文章主要為大家詳細介紹了react+antd.3x實現(xiàn)ip輸入框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • TypeScript在React項目中的使用實踐總結

    TypeScript在React項目中的使用實踐總結

    這篇文章主要介紹了TypeScript在React項目中的使用總結,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • react16.8.0以上MobX在hook中的使用方法詳解

    react16.8.0以上MobX在hook中的使用方法詳解

    這篇文章主要為大家介紹了react16.8.0以上MobX在hook中的使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • React實現(xiàn)PDF預覽功能與終極優(yōu)化

    React實現(xiàn)PDF預覽功能與終極優(yōu)化

    在前端開發(fā)中,PDF 預覽是個常見需求,本文主要來帶大家認識一個基于 react-pdf 的自定義 PDF 預覽組件 PDFView,感興趣的小伙伴可以了解下
    2025-05-05
  • react-native中路由頁面的跳轉與傳參的實例詳解

    react-native中路由頁面的跳轉與傳參的實例詳解

    這篇文章主要介紹了react-native中路由頁面的跳轉與傳參,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • React中完整實例講解Recoil狀態(tài)管理庫的使用

    React中完整實例講解Recoil狀態(tài)管理庫的使用

    這篇文章主要介紹了React中Recoil狀態(tài)管理庫的使用,Recoil的產生源于Facebook內部一個可視化數(shù)據(jù)分析相關的應用,在使用React的實現(xiàn)的過程中,因為現(xiàn)有狀態(tài)管理工具不能很好的滿足應用的需求,因此催生出了Recoil,對Recoil感興趣可以參考下文
    2023-05-05
  • React createElement方法使用原理分析介紹

    React createElement方法使用原理分析介紹

    這篇文章主要為大家介紹了React的createElement方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 在?React?中如何從狀態(tài)數(shù)組中刪除一個元素

    在?React?中如何從狀態(tài)數(shù)組中刪除一個元素

    這篇文章主要介紹了在?React?中從狀態(tài)數(shù)組中刪除一個元素,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 解決React報錯Expected an assignment or function call and instead saw an expression

    解決React報錯Expected an assignment or funct

    這篇文章主要為大家介紹了React報錯Expected an assignment or function call and instead saw an expression解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

嵩明县| 梧州市| 通化县| 定南县| 噶尔县| 保定市| 江门市| 阆中市| 昌邑市| 上杭县| 天祝| 昌吉市| 崇明县| 平南县| 河池市| 天柱县| 武城县| 印江| 恩施市| 固安县| 左权县| 华容县| 平邑县| 师宗县| 象州县| 工布江达县| 辽源市| 金溪县| 得荣县| 灵台县| 岢岚县| 霸州市| 贺州市| 怀仁县| 淮安市| 察雅县| 肥乡县| 乌鲁木齐县| 漠河县| 江北区| 嘉黎县|