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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo