目录

一、轮播图组件的封装

1. 安装 BeterScroll 及 Slide 插件

2. 新建 slide.vue 文件

3. 前往官网复制一个示例,做一个小 demo

4. 钩子函数的应用

二、滚动组件的封装

1. 新建 scroll 组件

2. 初始化BetterScroll

3. 添加属性

3. 安装并引入observe-dom


一、轮播图组件的封装

1. 安装 BeterScroll 及 Slide 插件

npm install @better-scroll/core --save// oryarn add @better-scroll/core
npm install @better-scroll/slide --save// oryarn add @better-scroll/slide

这样就表示我们安装完成:

2. 新建 slide.vue 文件

在 components 目录下新建 slide/slide.vue 来编写轮播图相关代码

3. 前往官网复制一个示例,做一个小 demo

下面是 slide.vue 的代码:

<template><div class="slider" ref="rootRef"><div class="slider-group"><divclass="slider-page"v-for="item in sliders":key="item.id"><img :src="item.pic"/></div></div><div class="dots-wrapper"><spanclass="dot"v-for="(item, index) in sliders":key="item.id":class="{'active': currentPageIndex === index}"></span></div></div>
</template><script>
import BScroll from '@better-scroll/core'
import Slide from '@better-scroll/slide'import { onMounted, onUnmounted, onActivated, onDeactivated, ref } from 'vue'BScroll.use(Slide)export default {name: 'slider',props: {sliders: {type: Array,default() {return []}}},setup(props) {const rootRef = ref(null)const slider = ref(null)const currentPageIndex = ref(0)onMounted(() => {const sliderVal = slider.value = new BScroll(rootRef.value, {click: true,scrollX: true,scrollY: false,momentum: false,bounce: false,probeType: 2,slide: true})sliderVal.on('slideWillChange', (page) => {currentPageIndex.value = page.pageX})})onUnmounted(() => {slider.value.destroy()})onActivated(() => {slider.value.enable()slider.value.refresh()})onDeactivated(() => {slider.value.disable()})return {slider,currentPageIndex,rootRef}}}
</script><style lang="less" scoped>.slider {position :relative;.slider-group {position: relative;overflow: hidden;white-space: nowrap;.slider-page {display: inline-block;transform: translate3d(0, 0, 0);backface-visibility: hidden;a {display: block;width: 100%;}img {display: block;width: 100%;}}}.dots-wrapper {position: absolute;left: 50%;bottom: 12px;line-height: 12px;transform: translateX(-50%);.dot {display: inline-block;margin: 0 4px;width: 8px;height: 8px;border-radius: 50%;background: rgba(255, 255, 255, 0.5);&.active {width: 20px;border-radius: 5px;background:rgba(255, 255, 255, 0.8);}}}}
</style>

轮播的信息通过 props 从父组件传递过来,下面是父组件的代码:

<template><header>头部</header><div><slide :sliders="list"></slide></div>
</template><script>
import slide from '../components/slider/slider.vue'
import { ref } from 'vue'
export default {name: 'HomeView',components: {slide},setup () {const list = ref([{id: 1,pic: "https://7463-tcb-tjpv7cz5f6ef80-7dw7b0630091b-1312294860.tcb.qcloud.la/swiper/havetea.png"},{id: 2,pic: "https://7463-tcb-tjpv7cz5f6ef80-7dw7b0630091b-1312294860.tcb.qcloud.la/swiper/谨防诈骗.png"},{id: 3,pic: "https://7463-tcb-tjpv7cz5f6ef80-7dw7b0630091b-1312294860.tcb.qcloud.la/swiper/首页轮播1.png"}])return {list}},
}
</script>
<style lang="less" scoped>
header {height: 30px;width: 100%;background-color: pink;
}
</style>

启动项目,看一下我们的轮播图:

4. 钩子函数的应用

下面我们再使用 composition api 的方式创建一个钩子函数,把 new slide 的逻辑抽离出去:

我们定义了一个 useSlider 函数,他传入的参数是轮播图的容器,这个是 betterScroll 必须的,返回的是当前页的索引值,下面我们看一下 use-slider.js 的代码:

import { onMounted, onUnmounted, onActivated, onDeactivated, ref } from 'vue'
import BScroll from '@better-scroll/core'
import Slide from '@better-scroll/slide'
BScroll.use(Slide)
export default function useSlider(wrapperRef) {const slider = ref(null)const currentPageIndex = ref(0)onMounted(() => {const sliderVal = slider.value = new BScroll(wrapperRef.value, {click: true,scrollX: true,scrollY: false,momentum: false,bounce: false,probeType: 2,slide: true})sliderVal.on('slideWillChange', (page) => {currentPageIndex.value = page.pageX})})onUnmounted(() => {slider.value.destroy()})onActivated(() => {slider.value.enable()slider.value.refresh()})onDeactivated(() => {slider.value.disable()})return {slider,currentPageIndex}
}

然后再看一下现在 slider.vue 的代码,就会感受到 composition api 的强大之处了:

import { ref } from 'vue'
import useSlider from './use-slider'export default {name: 'slider',props: {sliders: {type: Array,default() {return []}}},setup() {const rootRef = ref(null)const { currentPageIndex } = useSlider(rootRef)return {rootRef,currentPageIndex}}}

这样处理之后,useSlider 函数只跟 slide 轮播图的创建有关,主逻辑部分很清晰。

二、滚动组件的封装

在我们移动端的开发中经常会遇到滚动列表的场景,此时我们用原生的滚动效果是没有回弹及一些其他对交互很友好的动画效果的,类似于这样:

同样借助于 BetterScroll 我们可以轻松的封装一个自己的滚动组件来实现移动端下顺滑的滚动体验

1. 新建 scroll 组件

在 components 目录下新建 scroll / scroll.vue 文件,它的实现非常简单:

<template><div ref="rootRef"><slot></slot></div>
</template><script>export default {name: 'scroll'}
</script>

滚动的内容部分我们就放在 slot 插槽中,然后在外层的 div 盒子中通过 BetterScroll 做一些初始化的联动,让内容部分实现滚动。

2. 初始化BetterScroll

和上一讲的 slider 组件一样,我们使用 composition api 和 钩子函数的方式来和 BetterScroll 做初始化,所以我们新建 use-scroll.js 文件,代码如下所示

import BScroll from '@better-scroll/core'
import { onMounted, onUnmounted, ref } from 'vue'BScroll.use(ObserveDOM)export default function useScroll(wrapperRef) {const scroll = ref(null)onMounted(() => {scroll.value = new BScroll(wrapperRef.value)onUnmounted(() => {scroll.value.destroy()})}

这里的 wrapperRef 就是最外层的 dom ,我们通过 ref 获取他然后作为参数传进来,下一步我们在 scroll 中引入这个钩子函数:

<template><div ref="rootRef"><slot></slot></div>
</template><script>import useScroll from './use-scroll'import { ref } from 'vue'export default {name: 'scroll',setup() {const rootRef = ref(null)const scroll = useScroll(rootRef)return {rootRef}}}
</script>

这样我们简单的 scroll 组件就实现了

3. 添加属性

因为 BetterScroll 是支持我们添加很多自定义属性和事件的,比如在官网中可以定义 click 点击事件,它的默认值是 false:

现在我们就给我们的滚动组件添加这个 click 事件,这里的 click 我们想实现自定义配置就应该从使用 scroll 组件的父级传进来,那我们通过 props 接收他就好,然后把 props 作为参数传给需要用到他的钩子函数,这样不论 props 中添加了什么新的属性,钩子函数中都能获取到,因为都包含在 props 中,修改 scroll.vue 代码如下:

<template><div ref="rootRef"><slot></slot></div>
</template><script>import useScroll from './use-scroll'import { ref } from 'vue'export default {name: 'scroll',props: {click: {type: Boolean,default: true}setup(props) {const rootRef = ref(null)useScroll(rootRef, props, emit)return {rootRef}}}
</script>

值得注意的是, scroll 组件只对第一个子节点生效,这也是 BeterScroll 的特性。

如果 BetterScroll 的时候,并没有实现滚动,可以看一下文档中的滚动原理

BetterScroll 判断滚动是在初始化的时候就进行判断,也就是在 new BScroll 的时候进行计算,如果我们在 created 的时候获取列表数据,那显然很有可能我们在数据还没有获取的时候,BetterScroll 已经计算完了,这样页面就滚动不了。

解决这个问题的方法就是 BetterScroll 的一个插件:observe-dom:

这样当 我们的 dom 发生变化时,BetterScroll就能自动感知然后执行刷新操作。

3. 安装并引入observe-dom

npm install @better-scroll/observe-dom --save// oryarn add @better-scroll/observe-dom

use-scroll.vue:

import BScroll from '@better-scroll/core'
import ObserveDOM from '@better-scroll/observe-dom'
import { onMounted, onUnmounted, ref } from 'vue'BScroll.use(ObserveDOM)export default function useScroll(wrapperRef, options) {const scroll = ref(null)onMounted(() => {scroll.value = new BScroll(wrapperRef.value, {observeDOM: true,...options})onUnmounted(() => {scroll.value.destroy()})
}

我们试一下使用 scroll.vue 组件后的滚动列表的效果,下面是 Home.vue 的代码:

<template><div style="position:relative;"><div class="head">固定的头部</div><div class="main"><scroll class="theScroll"><div><div v-for="(i,index) in 10" :key="index" style="margin:10px 0"><van-cardnum="2"price="2.00"desc="描述信息"title="商品标题"thumb="https://fastly.jsdelivr.net/npm/@vant/assets/ipad.jpeg"/></div></div></scroll></div></div>
</template><script>
import slide from '../components/slider/slider.vue'
import scroll from '../components/scroll/scroll.vue'
import { ref } from 'vue'
export default {name: 'HomeView',components: {slide,scroll},setup () {const list = ref([{id: 1,pic: "https://7463-tcb-tjpv7cz5f6ef80-7dw7b0630091b-1312294860.tcb.qcloud.la/swiper/havetea.png"},{id: 2,pic: "https://7463-tcb-tjpv7cz5f6ef80-7dw7b0630091b-1312294860.tcb.qcloud.la/swiper/谨防诈骗.png"},{id: 3,pic: "https://7463-tcb-tjpv7cz5f6ef80-7dw7b0630091b-1312294860.tcb.qcloud.la/swiper/首页轮播1.png"}])return {list}},
}
</script>
<style lang="less" scoped>
.head {position: fixed;top: 0;left: 0;height: 50px;width: 100%;background-color: pink;z-index: 999;
}
.main {position: fixed;top: 50px;bottom: 0;left: 0;right: 0;background-color: rgb(232, 234, 235);.theScroll {height: 100%;overflow: hidden;}
}
</style>

启动项目,查看效果:

现在我们就实现了带回弹效果的这样顺滑的滚动了。

使用BetterScroll封装页面滚动及轮播图组件(一文入门移动端页面滚动神器BetterScroll)相关推荐

  1. 小程序轮播图组件跳转到自定义页面

    1.轮播图组件wxml代码 2.轮播图组件js 3.在页面引入轮播图组件 4.设置页面js 5.未跳转之前页面 6.点击轮播图跳转

  2. 组件封装 - 轮播图组件

    轮播图组件封装, 我们主要分为三大步来完成: 1. 基本布局 2. 渲染结构 3. 逻辑封装 我们这里封装的轮播图组件和 Element UI 所封装的走马灯组件有所不同 Element UI 是直接 ...

  3. js实现轮播图_高性能轻量级零依赖的轮播图组件——Glider.js

    介绍 Glider.js是一个依赖原生js的轮播图组件库,因为其压缩后仅仅2.8k大小,其拥有着很好的性能,Glider.js在Github上开源,目前已拥有2.4kstars. Github htt ...

  4. 使用原生js将轮播图组件化

    代码地址如下: http://www.demodashi.com/demo/11316.html   这是一个轮播图组件,这里是代码地址,需要传入容器的id和图片地址,支持Internet Explo ...

  5. Vue2 轮播图组件 slide组件

    Vue2原生始轮播图组件,支持宽度自适应.高度设置.轮播时间设置.左右箭头按钮控制,圆点按钮切换,以及箭头.圆点按钮是否显示. <v-carousel :slideData="slid ...

  6. Vue2 轮播图组件 原生slide组件

    Vue2原生始轮播图组件,支持宽度自适应.高度设置.轮播时间设置.左右箭头按钮控制,圆点按钮切换,以及箭头.圆点按钮是否显示. <v-carousel :slideData="slid ...

  7. 【微信小程序】好看的轮播图组件

    微信小程序好看的轮播图组件效果示例 使用步骤 第一步: 新建components文件夹 第二步: 按照以下目录创建文件:(文件名可以自定义,但后面引入组件时应保持前后一致) 第三步: 各个文件的代码: ...

  8. 摹客RP,新增轮播图组件

    Hello,小伙伴们,又到了摹客的新功能播报时间. 本月更新,摹客RP新增组件--轮播图,从此做轮播图页面能更简单了.摹客协作可支持识别Sketch上传设计稿中文字的颜色变量,并针对不少细节功能进行了 ...

  9. vue开发一个实用美观的轮播图组件

    网上有不少vue开发的轮播图资源,相信读者也看过不少,这里笔者开发了一个轮播图组件,简单美观实用. 先上示例图: 常见的轮播图都是占满屏幕的形式,像上图所示的轮播图虽然经常见到,但是在一些常见的轮播组 ...

  10. 微信小程序---swiper轮播图组件

    微信小程序-swiper轮播图组件 在components中新建文件夹swiper components/swiper/swiper.wxml <!--components/swiper/swi ...

最新文章

  1. 年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关
  2. 用敏捷开发工具可视化的进行Sprint规划
  3. SQL Server 安装好后 Always On群组配置
  4. 【学习笔记】类对象的内存释放
  5. 一步步学习微软InfoPath2010和SP2010--第八章节--使用InfoPath表单Web部件
  6. element ui input视图没刷新_[Selenium自动化测试实战] 如何在UI自动化测试中加入REST API的操作...
  7. python怎么设置代码执行时间_python 代码运行时间获取方式详解
  8. 2. 移动安全渗透测试-(Android安全基础)
  9. 如何添加评论_亚马逊评论数据分析
  10. 蓝桥杯 基础练习 FJ的字符串
  11. 翻译助手-免费翻译助手下载
  12. 在使用renderTo中遇到的Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null
  13. 阿里巴巴面试题含答案
  14. 【软件测试】如何抓取崩溃的log日志
  15. idea保存快捷键_windows10下idea快捷键文件
  16. 编译原理|LL(1)语法分析实验
  17. 对51job网页招聘信息的简单爬取
  18. 一步步图解 Java G1 垃圾收集器
  19. C++ string大小写转换
  20. oracle中dlink使用,create dlink(oracle)

热门文章

  1. 定义int数组求所有奇数的和
  2. 父亲节php源码,父亲节 | 愿时光再慢一点,祝天下所有的父亲,父亲节快乐
  3. 重言式判别 (数据结构课程设计)
  4. Opengl实例7:glm(0.9.8.5)库 +矩阵旋转+课后作业
  5. 别再用PS啦!用Excel轻松实现更换证件照背景颜色!
  6. 普通游戏显卡和专业图形显卡的区别
  7. 国美易卡的标识符和关键字是什么(国美易卡)
  8. 微信推出网页版传输助手,真的好用吗?
  9. 电商项目需求分析 七月实习总结
  10. 腾讯「文涌 (Effidit)」2.0版发布,打造更懂写作的智能助手