vue外卖十六:商家-食物列表:用滑动库better-scroll滑动列表、收集列表位移、各子列表top值

本文主要是介绍vue外卖十六:商家-食物列表:用滑动库better-scroll滑动列表、收集列表位移、各子列表top值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基础页面+基本滑动功能

1)基础页面+逻辑(见附件)

2)滑动库:better-scroll

  1. 官方文档:https://better-scroll.github.io/docs/zh-CN/guide
  2. git :https://github.com/ustbhuangyi/better-scroll

2.1安装

cnpm install @better-scroll/core --save
// or
yarn add @better-scroll/core

2.2使用shop/goods/goods.vue

  1. 动态展现列表数据
  2. 基本滑动:
    使用better-scroll
    理解其基本原理
    创建BScroll对象的时机
    watch + $nextTick()
    callback + $nextTick
<script>import {mapState} from 'vuex'//【1】引入库import BScroll from '@better-scroll/core'export default{mounted(){/*【2】用action触发请求获取食物列表后:再调用nextTick,*相当于vue的watch监听*要配合vuex中actions.js中的callback即:getShopGoods({commit},callback)*/this.$store.dispatch('getShopGoods',()=>{//【3】将回调延迟到下次 DOM 更新循环之后执行this.$nextTick(()=>{//【4】新建一个滚动实例参数是要滚动的DOM的类名new BScroll('.menu-wrapper')//【5】另一个要滚动的DOMnew BScroll('.foods-wrapper')})})},computed:{...mapState(['goods'])},}
</script>

效果:http://localhost:8080/#/shop/goods

按住都可滑动
在这里插入图片描述

二、滑动右侧左侧分类显示当前样式

1.分析+图解

  1. 滑动右侧列表, 左侧同步更新
    better-scroll禁用了原生的dom事件, 使用的是自定义事件
    绑定监听: scroll/scrollEnd
    滚动监听的类型: probeType
    列表滑动的3种类型
    手指触摸
    惯性
    编码
    3.1 分析:
    类名: current 标识当前分类
    设计一个计算属性: currentIndex
    根据哪些数据计算?
    scrollY: 右侧滑动的Y轴坐标 (滑动过程时实时变化)
    tops: 所有右侧分类li的top组成的数组 (列表第一次显示后就不再变化)
    3.2编码:
    1). 在滑动过程中, 实时收集scrollY
    2). 列表第一次显示后, 收集tops
    3). 实现currentIndex的计算逻辑
  2. 点击左侧列表项, 右侧滑动到对应位置
    如图:
    在这里插入图片描述

2.收集食物列表相对于顶点滑动后的实时位移:scrollY

mounted(){this.$store.dispatch('getShopGoods',()=>{//数据更新后执行this.$nextTick(()=>{//列表显示之后创建://新建一个滚动对象:第一个参数是类选择器,第二个参数:配置项const menuScorll=new BScroll('.menu-wrapper')const foodsScorll=new BScroll('.foods-wrapper',{probeType:2 //【1】滑动触发具体条件,惯性滑动不记录:文档>配置项>probeType})/*【2】给食物列表绑定滚动监听:以收集滚动y坐标*参数:scroll:文档api的事件的scroll:文档>api>事件>scroll*/foodsScorll.on('scroll',({x,y})=>{console.log(x,y)//输出一下滑动坐标看看//收集坐标的绝对值y到数据中this.scrollY=Math.abs(y)console.log(this.scrollY) //输出看看})})})}

效果:滚动食物列表,控制台输出:

0 -183
183
0 -734
734
0 -722
722
0 -708
708
0 -687
687
0 -655
655
0 -624
624
0 -585
585

2.1 _initScroll()收集实时位移,单独写成一个方法

mounted(){this.$store.dispatch('getShopGoods',()=>{//数据更新后执行this.$nextTick(()=>{//列表显示之后创建:this._initY() //调用滑动右侧列表,并收集Y位移this._initTop() //调用滑动左侧列表,并收集li的值})})},computed:{...mapState(['goods']),//计算得到当前分类的下标currentIndex(){}},methods:{//【1】收集滑动时top的实时位移数值_initY(){//新建一个滚动对象:第一个参数是类选择器,第二个参数:配置项new BScroll('.menu-wrapper',{})const foodsScorll=new BScroll('.foods-wrapper',{probeType:2 //滑动触发具体条件,惯性滑动不记录:文档>配置项>probeType})/*给食物列表绑定滚动监听:以收集滚动y移位*参数:scroll:文档api的事件的scroll:文档>api>事件>scroll*/foodsScorll.on('scroll',({x,y})=>{// console.log(x,y)this.scrollY=Math.abs(y)console.log(this.scrollY)})},//收集li的值_initTop(){}}

3. _initTop():收集食物列表的tops值

即各个食物子分类top2,top3的Y值

methods:{
//收集li的高度值为数组_initTop(){const tops=[]let top=0tops.push(top)/*结合ul的标识ref=topui,找到所有类名为food-list-hook的元素即*li对象组成的多层对象(此对象含lenght属性)*li内部有一个叫clientHeight记录此li的高度*/const lis=this.$refs.topUi.getElementsByClassName('food-list-hook')// console.log(lis) //打印一下收集到的li们对象组成的数组// console.log(typeof(lis)) //看看其类型// 把lis转换成一个数组,然后逐个读取其高度,并累加计算出每个li的顶部位置传入tops里// Array.prototype.slice.call用法详见:Array.prototype.slice.call(lis).forEach(li=>{// console.log(li)top+=li.clientHeighttops.push(top)})this.tops=topsconsole.log(tops)},
}

4.计算出scrollY位移所处的top在tops中对应的下标

//【2】:class="{current:k===currentIndex}
<li class="menu-item" v-for="(v,k) in goods" :key=k :class="{current:k===currentIndex}" >computed:{...mapState(['goods']),//【1】计算得到当前位移scrollY,所处分类top在tops中的下标currentIndex(){// 取得top0当前位移scrollY,和各食物分类top(n)组成的数组tops[]const {scrollY,tops}=this/* 用findIndex(参数1:当前计算的top值,参数2:当前top的下标)返回*  符合要求的下标*/const index=tops.findIndex((top,index)=>{// 返回下标满足的条件:scrollY>=top,且<下一个topreturn scrollY>=top && scrollY< tops[index+1]})// 返回符合的下标(即当前scrollY位移所处的top在tops中对应的下标)console.log('index:'+index)return index}}

效果:右侧滑动到对应分类,左侧跟着变

在这里插入图片描述

5. 惯性滑动时左侧当前分类不变+变化不准

methods:{//收集滑动食物列表时,列表顶点相对于原位置,在Y轴位移的实时数值_initY(){//新建一个滚动对象:第一个参数是类选择器,第二个参数:配置项new BScroll('.menu-wrapper',{})this.foodsScroll=new BScroll('.foods-wrapper',{probeType:2 //滑动触发具体条件,惯性滑动不记录:文档>配置项>probeType})/*给食物列表绑定滚动监听:以收集滚动y移位*参数:scroll:文档api的事件的scroll:文档>api>事件>scroll*/this.foodsScroll.on('scroll',({x,y})=>{// console.log(x,y)this.scrollY=Math.abs(y)console.log('scrollY:'+this.scrollY)})//【2】只收集惯性滚动结束时的y值// 给右侧列表绑定scroll结束的监听this.foodsScroll.on('scrollEnd', ({x, y}) => {console.log('scrollEnd', x, y)this.scrollY = Math.abs(y)})}
}

6.点左侧右侧自动滚动

//@click="clickMenuItem(k) 点击并传值给对应函数
<li class="menu-item" v-for="(v,k) in goods" :key=k :class="{current:k===currentIndex}" @click="clickMenuItem(k)">methods:{
clickMenuItem(index) {// console.log(index)// 使用右侧列表滑动到对应的位置// 得到目标位置的scrollYconst scrollY = this.tops[index]// 立即更新scrollY(让点击的分类项成为当前分类)this.scrollY = scrollY// 平滑滑动右侧列表 需要2.1步时用this.foodsScroll把它传入this中this.foodsScroll.scrollTo(0, -scrollY, 300)}
}

这篇关于vue外卖十六:商家-食物列表:用滑动库better-scroll滑动列表、收集列表位移、各子列表top值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965189

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路