亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

react+tsx中使用better-scroll詳解

 更新時(shí)間:2022年09月09日 16:01:27   作者:ygunoil  
這篇文章主要介紹了react+tsx中使用better-scroll,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

react+tsx中使用better-scroll

首先,你要知道為什么可以滾動(dòng),原理很簡(jiǎn)單,父容器的高度比子元素的小即可。

在這之前,我們先來(lái)看一下瀏覽器的滾動(dòng)原理: 瀏覽器的滾動(dòng)條大家都會(huì)遇到,當(dāng)頁(yè)面內(nèi)容的高度超過(guò)視口高度的時(shí)候,會(huì)出現(xiàn)縱向滾動(dòng)條;當(dāng)頁(yè)面內(nèi)容的寬度超過(guò)視口寬度的時(shí)候,會(huì)出現(xiàn)橫向滾動(dòng)條。也就是當(dāng)我們的視口展示不下內(nèi)容的時(shí)候,會(huì)通過(guò)滾動(dòng)條的方式讓用戶滾動(dòng)屏幕看到剩余的內(nèi)容。

第二,你需要滾動(dòng)的元素應(yīng)該是父元素下的第一個(gè)子元素。

這里要注意的是,BetterScroll 默認(rèn)處理容器(wrapper)的第一個(gè)子元素(content)的滾動(dòng),其它的元素都會(huì)被忽略。

第三,為什么我滿足了上面兩條,為什么還是不能滾動(dòng)?可能你的content用了異步的數(shù)據(jù),better-scroll實(shí)例化之后content的高度還是初始時(shí)的高度,這當(dāng)然無(wú)法滾動(dòng),解決方法是獲取到了異步的數(shù)據(jù)之后使用refresh()更新,或是使用插件@better-scroll/observe-dom來(lái)自動(dòng)更新高度, 或者observeDOM: true,

配置與初始化

這里我使用了better-scroll官方提供的幾個(gè)插件,ObserveDOM、MouseWheel、ScrollBarPullDownPullup。

大致的結(jié)構(gòu)

import BScroll from '@better-scroll/core'
import { BScrollConstructor } from '@better-scroll/core/dist/types/BScroll'
import ObserveDOM from '@better-scroll/observe-dom'
import MouseWheel from '@better-scroll/mouse-wheel'
import ScrollBar from '@better-scroll/scroll-bar'
import PullDown from '@better-scroll/pull-down'
import Pullup from '@better-scroll/pull-up'
 
export interface ScrollProps {
  wrapHeight: string;
  prop?: any;
  onPullup?: Function;
  onPulldown?: Function;
}
 
const Scroll: React.FC<ScrollProps> = ({  
  wrapHeight,
  prop,
  onPullup,
  onPulldown,
  children,}) => {
  BScroll.use(ObserveDOM)
  BScroll.use(MouseWheel)
  BScroll.use(ScrollBar)
  BScroll.use(PullDown)
  BScroll.use(Pullup)
 
 // ...
 
  return (
    <div className="scroll-warpper" ref={wrapRef} style={{ height: wrapHeight, overflow: 'hidden' }}>
      <div className="scroll-content">
        {children}
      </div>
    </div>
  )
}
 
export default Scroll

ok,準(zhǔn)備工作完成,接下來(lái)準(zhǔn)備better-scroll的實(shí)例化

BetterScroll 提供了一個(gè)類(lèi),實(shí)例化的第一個(gè)參數(shù)是一個(gè)原生的 DOM 對(duì)象。當(dāng)然,如果傳遞的是一個(gè)字符串,BetterScroll 內(nèi)部會(huì)嘗試調(diào)用 querySelector 去獲取這個(gè) DOM 對(duì)象。

//  外層的wrap實(shí)例
const wrapRef = useRef<HTMLDivElement>(null)
 
//  記錄Better-scroll是否實(shí)例化,為后續(xù)掛載下拉刷新和上拉加載做準(zhǔn)備
const initRef = useRef(false)
 
//  存儲(chǔ)better-scroll的實(shí)例
const [scrollObj, setscrollObj] = useState<BScrollConstructor>()
 
//  better-scroll的配置參數(shù)
const initBScroll = () => {
  setscrollObj(
    new BScroll(wrapRef.current as HTMLDivElement, {
      //probeType 為 3,任何時(shí)候都派發(fā) scroll 事件,包括調(diào)用 scrollTo 或者觸發(fā) momentum 滾動(dòng)動(dòng)畫(huà)
      probetype: 3,
      //  可以使用原生的點(diǎn)擊
      click: true,
      //  檢測(cè)dom變化
      observeDOM: true,
      //  鼠標(biāo)滾輪設(shè)置
      mouseWheel: {
        speed: 20,
        invert: false,
        easeTime: 300
      },
      //  顯示滾動(dòng)條
      scrollY: true,
      scrollbar: true,
      //  過(guò)度動(dòng)畫(huà), 在下載更多的時(shí)候滾動(dòng)條會(huì)有個(gè)過(guò)度動(dòng)畫(huà)
      useTransition: true,
      //  下拉刷新
      pullDownRefresh: {
        threshold: 70,
        stop: 0
      },
      //  上拉加載更多
      pullUpLoad: {
        threshold: 90,
        stop: 10
      }
    })
  )
}

接著是在組件掛載階段時(shí),將better-scroll進(jìn)行實(shí)例化,以及為其添加下拉和上拉監(jiān)聽(tīng)函數(shù)

//  對(duì)象初始化
useEffect(() => {
  initBScroll()
  return () => {
    //  組件卸載時(shí)記得將其銷(xiāo)毀
    scrollObj?.destroy()
  }
}, [])
 
//  下拉刷新
const pulldown = async () => {
  onPulldown && (await onPulldown())
  setTimeout(() => {
    //  記得使用finishPullDown,不然你只能下拉一次
    scrollObj?.finishPullDown()
    //  下拉之后你的content會(huì)發(fā)生變化,如果不使用refresh,你需要滑動(dòng)一下才能刷新content的高度
    scrollObj?.refresh()
  }, 500)
}
 
//  上拉加載
const pullup = async () => {
  onPullup && (await onPullup())
  setTimeout(() => {
    scrollObj?.finishPullUp()
    scrollObj?.refresh()
  }, 500)
}
 
//  對(duì)象事件掛載
useEffect(() => {
  if (initRef.current === true) {
    //  下拉刷新
    //  每次更新都需要先把之前的pullingDown事件清除,不然會(huì)累加
    scrollObj?.off("pullingDown");
    scrollObj?.once("pullingDown", pulldown);
 
    //  上拉加載
    //  每次更新都需要先把之前的pullingUp事件清除,不然會(huì)累加
    scrollObj?.off("pullingUp");
    scrollObj?.once("pullingUp", pullup);
  } else {
    initRef.current = true;
  }
  //  為什么監(jiān)聽(tīng)prop是因?yàn)檫@邊監(jiān)聽(tīng)不到外面的state變化
  //  handlePullUp的[...state, ...res.data]中的state會(huì)中始終為一開(kāi)始的[]
}, [prop]);

實(shí)踐

import React, { CSSProperties, useEffect, useState, useCallback } from "react";
import Scroll from "./scroll";
import axios, { Method } from "axios";
 
export interface TestProps {}
 
interface ResponseType {
  code: number;
  data: any;
}
 
const Test: React.FC<TestProps> = () => {
  const style: CSSProperties = {
    width: "500px",
  };
 
  const request = (url: string, method: Method): Promise<ResponseType> => {
    return new Promise((resolve, reject) => {
      const options = {
        url,
        method,
      };
      axios(options)
        .then((res) => {
          const data = res.data as ResponseType;
          resolve(data);
        })
        .catch((err) => reject(err));
    });
  };
 
  const getData = () => request("/api/datasource", "GET");
 
  const getMore = () => request("/api/abc", "GET");
 
  const [state, setstate] = useState<any[]>([]);
 
  // 一開(kāi)始拉取數(shù)據(jù)
  useEffect(() => {
    (async function () {
      const res = await getData();
      console.log(res);
      res.code === 0 && setstate(res.data);
    })();
  }, []);
 
  const handlePullUp = useCallback(async () => {
    const res = await getMore();
    res.code === 0 && setstate(state.concat(res.data));
  }, [state]);
 
  async function handlePullDown() {
    const res = await getData();
    res.code === 0 && setstate(res.data);
  }
 
  return (
    <div style={style}>
      <Scroll
        wrapHeight="300px"
        prop={state}
        onPullup={handlePullUp}
        onPulldown={handlePullDown}
      >
        {state.map((item, idx) =>
          idx % 2 === 0 ? (
            <div key={idx} style={{ height: "200px", background: "red" }}>
              {item}
            </div>
          ) : (
            <div key={idx} style={{ height: "200px", background: "green" }}>
              {item}
            </div>
          )
        )}
      </Scroll>
    </div>
  );
};
export default Test;

到此這篇關(guān)于react+tsx中使用better-scroll的文章就介紹到這了,更多相關(guān)react使用better-scroll內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的示例代碼

    React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的示例代碼

    因?yàn)?react、vue都是單頁(yè)面應(yīng)用,路由跳轉(zhuǎn)時(shí),就會(huì)銷(xiāo)毀上一個(gè)頁(yè)面的組件,但是有些項(xiàng)目不想被銷(xiāo)毀,想保存狀態(tài),本文給大家介紹了React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的代碼示例,需要的朋友可以參考下
    2024-01-01
  • 詳解React項(xiàng)目中eslint使用百度風(fēng)格

    詳解React項(xiàng)目中eslint使用百度風(fēng)格

    這篇文章主要介紹了React項(xiàng)目中eslint使用百度風(fēng)格,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • react?fiber使用的關(guān)鍵特性及執(zhí)行階段詳解

    react?fiber使用的關(guān)鍵特性及執(zhí)行階段詳解

    這篇文章主要為大家介紹了react?fiber使用的關(guān)鍵特性及執(zhí)行階段詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • React?useEffect不支持async?function示例分析

    React?useEffect不支持async?function示例分析

    這篇文章主要為大家介紹了React?useEffect不支持async?function示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 為react組件庫(kù)添加typescript類(lèi)型提示的方法

    為react組件庫(kù)添加typescript類(lèi)型提示的方法

    這篇文章主要介紹了為react組件庫(kù)添加typescript類(lèi)型提示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 深入理解React與閉包的關(guān)系

    深入理解React與閉包的關(guān)系

    本文將深入探討React與閉包之間的關(guān)系,我們將首先介紹React和閉包的基本概念,然后詳細(xì)解釋React組件中如何使用閉包來(lái)處理狀態(tài)和作用域的問(wèn)題,希望通過(guò)本文的閱讀,你將對(duì)React中閉包的概念有更深入的理解,并能夠在開(kāi)發(fā)React應(yīng)用時(shí)更好地應(yīng)用閉包
    2023-07-07
  • 一文詳解React?Redux使用方法

    一文詳解React?Redux使用方法

    這篇文章主要介紹了一文詳解React?Redux使用方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • React?antd中setFieldsValu的簡(jiǎn)便使用示例代碼

    React?antd中setFieldsValu的簡(jiǎn)便使用示例代碼

    form.setFieldsValue是antd?Form組件中的一個(gè)方法,用于動(dòng)態(tài)設(shè)置表單字段的值,它接受一個(gè)對(duì)象作為參數(shù),對(duì)象的鍵是表單字段的名稱(chēng),值是要設(shè)置的字段值,這篇文章主要介紹了React?antd中setFieldsValu的簡(jiǎn)便使用,需要的朋友可以參考下
    2023-08-08
  • React事件綁定的方式詳解

    React事件綁定的方式詳解

    react事件綁定時(shí)。this并不會(huì)指向當(dāng)前DOM元素。往往使用bind來(lái)改變this指向,今天通過(guò)本文給大家介紹React事件綁定的方式,感興趣的朋友
    2021-07-07
  • react簡(jiǎn)單實(shí)現(xiàn)防抖和節(jié)流

    react簡(jiǎn)單實(shí)現(xiàn)防抖和節(jié)流

    在日常開(kāi)發(fā)中,我們經(jīng)常會(huì)有防抖和節(jié)流的需要,可以減小服務(wù)器端壓力,提升用戶體驗(yàn),本文就詳細(xì)的介紹了react簡(jiǎn)單實(shí)現(xiàn)防抖和節(jié)流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論