首页 > 其他分享 >vue3+betterScroll scroll滚动组件

vue3+betterScroll scroll滚动组件

时间:2023-01-29 12:11:23浏览次数:48  
标签:scrollRef betterScroll bs vue3 import BScroll scroll getScroll

betterScroll在MVVM框架中使用时最麻烦的是更新时机,一般的需要滚动的列表数据都是来源于后端,是异步的。就必须要渲染完后refresh()一下。但是单独的Scroll组件是通过插槽放置列表数据内容的,无法直接确定什么时候更新了节点。通过插槽放置内容,当内容加载完成就更新betterScroll实例,这里就涉及到父子传递,这里使用了依赖注入的办法把refresh()传递到子组件中

  • 新建一个page.vue组件 betterScroll需要的基本结构
点击查看代码
<!-- page.vue -->
<template>
  <div class="page">
    <div class="center">
      <slot></slot>
    </div>
  </div>
</template>

<script setup lang='ts'>

</script>
<style lang="less" >
.page {
  width: 100%;
  height: 100%;
  min-width: fit-content;
  max-width: 100vw;
  overflow: hidden;

  .center {
    height: auto;
  }
}
</style>

  • 新建use-scroll.ts
    scrollRef是要监听滚动的DOM 在这里声明后把它传出到组件绑定到ref
    bs放置BScroll实例
    在getScroll方法中new BScroll,如果已经new过了就直接更新原来的bs实例
    更新时需要在等待DOM更新完成也就是放在nextTick之后
//use-scroll.ts
import type { Options } from '@better-scroll/core';
import BScroll from '@better-scroll/core';
import MouseWheel from '@better-scroll/mouse-wheel';
import ScrollBar from '@better-scroll/scroll-bar';
import { nextTick, onMounted, onUnmounted, ref } from 'vue';

BScroll.use(MouseWheel)//鼠标滚轮
BScroll.use(ScrollBar)//滚动条

/**
 * BScroll 滚动
 * @param { Options } options BScroll配置项
 * @returns { {scrollRef,bs,getScroll} }
 */
export default (options?: Options) => {
  const scrollRef = ref<HTMLElement>()
  const bs = ref<BScroll | undefined>()

  //new BScroll 如果new过了就直接更新
  const getScroll = async () => {
    if (!scrollRef.value) return
    if (!bs.value) {
      // BetterScroll实例
      bs.value = new BScroll(scrollRef.value, {
        scrollY: true,//沿Y轴滚动
        scrollX: true,//沿X轴滚动
        click: true,//派发点击事件
        probeType: 3,//反向偏移量
        mouseWheel: true,//开启鼠标滚轮插件
        scrollbar: true,//开启滚动条插件
        ...(options || {})
      })
      return
    }
    await nextTick()
    // bs.scrollToElement(scrollRef.value, 0, true, true)
    bs.value.refresh()//更新BScroll
  }

  onMounted(() => {
    getScroll()
  })

  onUnmounted(() => {
    // 移除BetterScroll
    bs.value && bs.value.destroy && bs.value.destroy?.()
  })

  return {
    scrollRef,//所监听的ref
    bs, //BetterScroll实例
    getScroll,//重新计算scroll
  }
}

修改page.vue组件

引入use-scroll.ts 把scrollRef绑定到外层节点上
添加依赖注入 把getScroll提供给子组件 provide('scroll', getScroll)

<template>
  <div class="page" ref="scrollRef">
    <div class="center">
      <slot></slot>
    </div>
  </div>
</template>

<script setup lang='ts'>
import scroll from './use-scroll';
const { scrollRef, getScroll, bs } = scroll()//使用BetterScroll
// 注入更新BScroll方法 子组件在节点变化后调用
provide('scroll', getScroll)

</script>
<style lang="less" >
.page {
  width: 100%;
  height: 100%;
  min-width: fit-content;
  max-width: 100vw;
  overflow: hidden;

  .center {
    height: auto;
  }
}
</style>

新建一个list.vue 渲染20张图片列表

<template>
  <ul>
    <li v-for="item in data.list">
      <img style="width:100%" :src="item.img" alt="">
    </li>
  </ul>
</template>
  
<script setup lang='ts'>
import { onMounted, reactive } from 'vue';
const getScroll = inject<Function>('scroll', () => { })//接收getScroll
const data = reactive<{ list: { img: string }[] }>({
  list: []
})

onMounted(() => {
  // 5秒后更新数据并调用getScroll重新计算
  setTimeout(() => {
    data.list = Array(20).fill({ img: 'data:image/jpeg;base64,/9j/.....' })//20张图片
    getScroll()
  }, 5000)
})
</script>

引入到App.vue中使用

<script setup lang="ts">
import list from './views/pages/list.vue';
import page from './components/pageView/page.vue';
</script>

<template>
  <page class="main">
    <list />
  </page>
</template>

<style scoped>
.main {
  width: 100vw;
  height: 100vh;
}
</style>

image

标签:scrollRef,betterScroll,bs,vue3,import,BScroll,scroll,getScroll
From: https://www.cnblogs.com/zsyh/p/17072337.html

相关文章

  • NUXT3踩坑之scrollreveal
    前言个人需要写一个官网,技术选型选择了VUE,因为SEO所以选择了NUXT3由于需要加入一些动画,所以选择了scrollreveal第一次使用NUXT3,多有不熟。我参考了网上相关的文档最后......
  • Vue3用vue ui创建vue2项目时报错
    问题:选中以Vue2默认模板创建时候,下方和控制台出现以下报错Failedtogetresponsefromhttps://registry.yarnpkg.com/vue-cli-version-marker解决:查看C盘下的.vuerc......
  • Vue3数据对接报错(Unhandled error during execution of render function )
    如图:、 意思就是说:多了个value,在渲染div的时候,一些部分不应该有value查看一下传输数据的时候中间是否有null值的,或者无效值 ......
  • 感受Vue3的魔法力量
    作者:京东科技牛至伟近半年有幸参与了一个创新项目,由于没有任何历史包袱,所以选择了Vue3技术栈,总体来说感受如下:•setup语法糖<scriptsetuplang="ts">摆脱了书写声明式的......
  • 感受 Vue3 的魔法力量
    ​  作者:京东科技牛至伟近半年有幸参与了一个创新项目,由于没有任何历史包袱,所以选择了Vue3技术栈,总体来说感受如下:•setup语法糖<scriptsetuplang="ts">摆脱了书......
  • vue3 中element-plusDropdown 背景色改变
    vue3中element-plusDropdown组件样式改变最近打算学习一下vue3,引入组件库的时候了解到vue3推荐使用element-plus,本以为和elememt-ui用起来差不多的,但是还是天真了(深深......
  • vue3的unplugin-auto-import自动引入
    vue3的unplugin-auto-import,setup语法糖下自动引入vue的基本apihttps://blog.csdn.net/weixin_52020362/article/details/127841641......
  • jquery随手做的一个滚动库 我称之为 idkScroll
    /***仅做到底自动刷新功能*options:{*pageint当前在第几页*limitint每页个数*onBottomfunction到底的回调*whenEndfunction结......
  • Vue3.2 新增 v-memo
    这个指令是​​Vue3.2​​新增的内置指令,大致的作用就是小幅度手动提升一部分​​性能​​官网文档​​cn.vuejs.org/api/built-i…​​用法在组件和元素都可以使用,主要是......
  • Vue3 封装扩展并简化Vuex在组件中的调用
    如果你在项目中使用了vuex模块化,并且在项目中使用actions中函数调用频率高,推荐了解一下这种方式。比如下面两种方式调用,第一个是直接传参设置,第二个是添加了异步ajax......