better-scroll 在vue3

news/2024/7/10 2:06:54 标签: vue, javascript, better-scroll, 移动开发, 滚动条

前言

最近在vue3中研究了一下移动端常用的插件better-scroll,方便确实是很方便,不过也是踩了不少的坑。共勉。
PS:本文着重说明笔者遇到的坑点

正文

一. 安装

$ npm i better-scroll

二. 引入

在你需要的组件进行局部引入

javascript">import Bscroll from 'better-scroll'

三. 使用

  1. 创建实例
    setupAPI中,需将创建实例的过程放入onMounted函数中。因为实例的创建需要寻找DOM元素,而在挂载完数据的onMounted周期,就可以完成了。而在setup的其他部分,我们也很可能用到这个实例。所以,要把声明放在onMounted之外,只在其中赋值。
javascript">onMounted(() => {
   bscroll = new Bscroll((document.querySelector('.wrapper')) as any, {
     scrollY: true,
     probeType: 3,
     click: true,
     pullUpLoad: true,
     mouseWheel: true
   })
})
  1. 注册事件
    利用这个插件,主要目的就是实现上拉加载数据。pullingUp是上拉事件,有个特别之处,就是一旦触发一次pullingUp,如果不手动调用实例方法bscroll.finishPullUp(),则一直不会再触发该事件。通常,获取分页数据之后,会在回调函数中判断:如果数据不为空,则调用bscroll.finishPullUp(),从而再次获取数据;如果数据为空,意味着数据已经全部加载,则不调用。
javascript">onMounted(() => {
  bscroll = new Bscroll((document.querySelector('.wrapper')) as any, {
    scrollY: true,
    probeType: 3,
    click: true,
    pullUpLoad: true,
    mouseWheel: true
  })

  //上拉加载数据
  bscroll.on('pullingUp', () => {
    getHomeGoods(GoodsTypesEnum[data.contentIndex], ++data.currentPage)
        .then((res: any) => {
          if (res.goods.length > 0) {
            goods.value.push(...res.goods)
            bscroll.finishPullUp()
          }
        })
  })
})
  1. 上一点的补充
    这里还有一个点要注意:如下图,切换tab栏可以从接口中获取不同排序的数据。当按销量排序获取数据,且不断下拉,直至数据全部加载完毕。此时,如果点击时间排序,请求参数分页会初始化为1(或为其他,本例是1)。同时,你也会发现,上拉加载数据失效。其实并不难发现,加载完数据之后,我们没有调用bscroll.finishPullUp(),导出上拉事件无法触发。解决的方法也很简单,在切换tab栏时,加入一行代码即可。
javascript">bscroll && bscroll.finishPullUp()

在这里插入图片描述
4. 实例方法refresh()
很重要! 当你展现在页面的数据列表发生变化,从而导致了DOM元素高度的变化,那么就要调用这个方法,否则better-scorll会不正常工作。比如,上拉加载一次数据后,数据被加入到了数据列表,这导致v-for遍历生成的DOM更多,高度也就变高了,这是就需要调用refresh()。但是,如果你在获取数据后的回调函数中同步调用这个方法,则无法生效。这是,可以利用watchnextTick。记得开启深度监听,否则可能监听不到。如果你的数据列表是用ref声明的响应式数据,则像下面的代码那样即可;如果你的数据列表是用reactive的数据模型中的属性,则在watch中,要写成getter函数的方式

javascript">    watch(goods, () => {
      nextTick(() => {
        bscroll && bscroll.refresh()
      })
    }, {
      deep: true
    })
  1. 待补充…

结语

如果对你有帮助的话,请点一个赞吧


http://www.niftyadmin.cn/n/1257936.html

相关文章

nodejs 中 token 的使用

前言 token 验证,在设计登录注册和一些权限接口时发挥作用。以nodejs为例,谈一谈jsonwebtoken的使用。 正文 一. 安装 $ npm i jsonwebtoken二. 使用 首先,需要提供一个密匙,也就是一个字符串,用于token的生成和验…

JavaScript前端面试题整理

前言 本博客部分题目来自B站UP主峰华前端工程师 笔者觉得有些题目不错,记录一下。 正文 运行结果是? const a (b)>{return b instanceof Function ? b() : b }console.log(a) console.log(a(()>hello)) console.log(a(world)). . . . . . …

前端工作周报

实习期,记录一些工作中遇到的问题 正文 一. 关于watch 更新列表的话,就用watch监听变化的部分,不要再变动之后的callback中逐一处理,如在增加或删除列表项时,再给本地列表进行加减,笨方法。watch监听的越…

element tab选项卡标签样式

前言 今天工作时有一个需求,大致是把elementUI的选项卡标签样式修改修改。起初是想直接重写element样式类,但是需求中还需对标签中的数字特殊处理,这种方式就行不通了。百度找了很久,终于在一个偏僻的角落找到了答案。 正文 使…

JavaScript两个数组的数据处理

来自思否的一个问答。 原文链接 正文 问题 提问者大概需求为将下面的两个数组,经过处理后变为预期的数组 原数组 const arr1 [{ uid: 2 }, { uid: 3 }, { uid: 4 }]; const arr2 [{text: 随便1,children: [{ uid: 1 }, { uid: 2 }],},{text: 随便2,children: …

MySQL、Oracle和SQL Server的分页查询语句

原文地址:http://www.cnblogs.com/ginponson/p/5746435.html 假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql、Oracle和SQL Server分页查询student表。 1.Mysql的分页查询 SELECT * FROM student LIMIT (PageNo - 1) * PageSi…

List 中去除 null 方法讨论

先看下面的程序段&#xff1a; public static void main(String[] args) { List<Integer> arrays new ArrayList<Integer>(); arrays.add(2); arrays.add(null); arrays.add(456); arrays.add(null); arrays.add(789); System.out.println(arrays); } …

前端工作周报8.2

记录工作中的收获 正文 1. 样式问题 文字超出容器显示省略号&#xff0c;必须设置三个属性&#xff1a; white-space: nowrap; text-overflow: ellipsis; overflow: hidden;除此之外&#xff0c;容器的display需为block/inline-block Margin负值不生效的话&#xff0c;考虑…