我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react+tsx中使用better-scroll详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react+tsx中使用better-scroll详解

react+tsx中使用better-scroll

首先,你要知道为什么可以滚动,原理很简单,父容器的高度比子元素的小即可。

在这之前,我们先来看一下浏览器的滚动原理: 浏览器的滚动条大家都会遇到,当页面内容的高度超过视口高度的时候,会出现纵向滚动条;当页面内容的宽度超过视口宽度的时候,会出现横向滚动条。也就是当我们的视口展示不下内容的时候,会通过滚动条的方式让用户滚动屏幕看到剩余的内容。

第二,你需要滚动的元素应该是父元素下的第一个子元素。

这里要注意的是,BetterScroll 默认处理容器(wrapper)的第一个子元素(content)的滚动,其它的元素都会被忽略。

第三,为什么我满足了上面两条,为什么还是不能滚动?可能你的content用了异步的数据,better-scroll实例化之后content的高度还是初始时的高度,这当然无法滚动,解决方法是获取到了异步的数据之后使用refresh()更新,或是使用插件@better-scroll/observe-dom来自动更新高度, 或者observeDOM: true,

配置与初始化

这里我使用了better-scroll官方提供的几个插件,ObserveDOMMouseWheelScrollBarPullDownPullup

大致的结构

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,准备工作完成,接下来准备better-scroll的实例化

BetterScroll 提供了一个类,实例化的第一个参数是一个原生的 DOM 对象。当然,如果传递的是一个字符串,BetterScroll 内部会尝试调用 querySelector 去获取这个 DOM 对象。

//  外层的wrap实例
const wrapRef = useRef<HTMLDivElement>(null)
 
//  记录Better-scroll是否实例化,为后续挂载下拉刷新和上拉加载做准备
const initRef = useRef(false)
 
//  存储better-scroll的实例
const [scrollObj, setscrollObj] = useState<BScrollConstructor>()
 
//  better-scroll的配置参数
const initBScroll = () => {
  setscrollObj(
    new BScroll(wrapRef.current as HTMLDivElement, {
      //probeType 为 3,任何时候都派发 scroll 事件,包括调用 scrollTo 或者触发 momentum 滚动动画
      probetype: 3,
      //  可以使用原生的点击
      click: true,
      //  检测dom变化
      observeDOM: true,
      //  鼠标滚轮设置
      mouseWheel: {
        speed: 20,
        invert: false,
        easeTime: 300
      },
      //  显示滚动条
      scrollY: true,
      scrollbar: true,
      //  过度动画, 在下载更多的时候滚动条会有个过度动画
      useTransition: true,
      //  下拉刷新
      pullDownRefresh: {
        threshold: 70,
        stop: 0
      },
      //  上拉加载更多
      pullUpLoad: {
        threshold: 90,
        stop: 10
      }
    })
  )
}

接着是在组件挂载阶段时,将better-scroll进行实例化,以及为其添加下拉和上拉监听函数

//  对象初始化
useEffect(() => {
  initBScroll()
  return () => {
    //  组件卸载时记得将其销毁
    scrollObj?.destroy()
  }
}, [])
 
//  下拉刷新
const pulldown = async () => {
  onPulldown && (await onPulldown())
  setTimeout(() => {
    //  记得使用finishPullDown,不然你只能下拉一次
    scrollObj?.finishPullDown()
    //  下拉之后你的content会发生变化,如果不使用refresh,你需要滑动一下才能刷新content的高度
    scrollObj?.refresh()
  }, 500)
}
 
//  上拉加载
const pullup = async () => {
  onPullup && (await onPullup())
  setTimeout(() => {
    scrollObj?.finishPullUp()
    scrollObj?.refresh()
  }, 500)
}
 
//  对象事件挂载
useEffect(() => {
  if (initRef.current === true) {
    //  下拉刷新
    //  每次更新都需要先把之前的pullingDown事件清除,不然会累加
    scrollObj?.off("pullingDown");
    scrollObj?.once("pullingDown", pulldown);
 
    //  上拉加载
    //  每次更新都需要先把之前的pullingUp事件清除,不然会累加
    scrollObj?.off("pullingUp");
    scrollObj?.once("pullingUp", pullup);
  } else {
    initRef.current = true;
  }
  //  为什么监听prop是因为这边监听不到外面的state变化
  //  handlePullUp的[...state, ...res.data]中的state会中始终为一开始的[]
}, [prop]);

实践

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[]>([]);
 
  // 一开始拉取数据
  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;

到此这篇关于react+tsx中使用better-scroll的文章就介绍到这了,更多相关react使用better-scroll内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react+tsx中使用better-scroll详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue使用better scroll无法滚动如何解决

本文小编为大家详细介绍“vue使用better scroll无法滚动如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue使用better scroll无法滚动如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习
2023-07-04

怎么在vue中使用better-scroll实现横向滚动

本篇文章为大家展示了怎么在vue中使用better-scroll实现横向滚动,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、滚动的实现原理better-scroll的滚动原理和浏览器原生滚动原理是
2023-06-15

一文详解如何在Vue3中使用jsx/tsx

本篇文章旨在带领大家快速了解和使用 Vue 中的 JSX 语法,好让大家在 Vue 中遇到或使用 JSX 的时候能很快入手,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-23

怎么在Vue中使用better-scroll组件实现横向滚动功能

怎么在Vue中使用better-scroll组件实现横向滚动功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、滚动的实现原理better-scroll的滚动
2023-06-15

如何解决vue开发移动端使用better-scroll时click事件失效的问题

本篇内容主要讲解“如何解决vue开发移动端使用better-scroll时click事件失效的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决vue开发移动端使用better-scro
2023-06-20

Element UI中v-infinite-scroll无限滚动组件使用详解

在移动端数据的更新中许多方法孕育而生,无限滚轮也是解决的方案一种,Element-ui为vue开发了一个事件(v-infinite-scroll),下面这篇文章主要给大家介绍了关于Element UI中v-infinite-scroll无限滚动组件使用的相关资料,需要的朋友可以参考下
2023-02-08

详解React中Fragment的简单使用

这篇文章主要介绍了详解React中Fragment的简单使用,文中通过示例代码介绍的非常详细,对我们学习React有一定的帮助,感兴趣的小伙伴们可以参考一下
2022-11-13

react 中 mobx的使用案例详解

这篇文章主要介绍了react 中 mobx的使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-15

React 新 Hook:UseFormStatus 使用详解

useFormStatus 是结合 Action 异步请求时使用的 Hook,它们是对 HTML 表单能力的增强。因此我们可以借助他们与 HTML 表单元素自身支持的特性实现更复杂的表单交互逻辑。
HTMLHookReact2024-11-29

react中使用antd及immutable示例详解

这篇文章主要为大家介绍了react中使用antd及immutable示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

详解React antd中setFieldsValu的简便使用

React是一个流行的JavaScript库,用于构建用户界面。它提供了一种简单而高效的方式来创建交互式的Web应用程序。而antd(Ant Design)是一个基于React的UI组件库,它提供了丰富的UI组件和样式,帮助开发者更快速地构
2023-08-30

React Context详解使用方法

Context提供了一个无需为每层组件手动添加props,就能在组件树间进行数据传递的方法。在一个典型的 React 应用中,数据是通过props属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的
2022-12-03

详解使用IOC解耦React组件

IOC(控制反转)是一种编程思想,可以解耦组件,提高组件复用性。

编程热搜

目录