Vue实现左右菜单联动实现代码


Posted in Javascript onAugust 12, 2018

本文介绍了Vue实现左右菜单联动实现代码吗,分享给大家,也给自己留个笔记,具体如下:

Github

源码传送门: Rain120/vue-study

之前在外卖软件上看到这个左右联动的效果,觉得很有意思,所以就尝试使用 Vue 来实现,将这个联动抽离成为一个单独的组件,废话少说,先来一张效果图。

Vue实现左右菜单联动实现代码

这个组件分为两个部分,1、左菜单;2、右菜单。 左菜单的 DOM 结构

<scroll
 class="left-menu"
 :data="leftMenu"
 ref="leftMenu">
 <div class="left-menu-container">
 <ul>
  <li
  class="left-item"
  ref="leftItem"
  :class="{'current': currentIndex === index}"
  @click="selectLeft(index, $event)"
  v-for="(item, index) in leftMenu"
  :key="index">
  <p class="text">{{item}}</p>
  </li>
 </ul>
 </div>
</scroll>

右菜单的 DOM 结构

<scroll
 class="right-menu"
 :data="rightMenu" 
 ref="rightMenu"
 @scroll="scrollHeight"
 :listenScroll="true"
 :probeType="3">
 <div class="right-menu-container">
 <ul>
  <li class="right-item" ref="rightItem" v-for="(items, i) in rightMenu" :key="i">
  <div class="data-wrapper">
   <div class="title">{{items.title}}</div>
   <div class="data" v-for="(item, j) in items.data" :key="j">{{item}}</div>
  </div>
  </li>
 </ul>
 </div>
</scroll>

这里是为了做 demo ,所以在数据上只是单纯捏造。

当然因为这是个子组件,我们将通过父组件传递 props ,所以定义 props

props: {
 leftMenu: {
 required: true,
 type: Array,
 default () {
  return []
 }
 },
 rightMenu: {
 required: true,
 type: Array,
 default () {
  return []
 }
 },
}

Vue实现左右菜单联动实现代码

在这个业务场景中,我们的实现方式是根据右边菜单滚动的高度来计算左边菜单的位置,当然左边菜单也可以通过点击来确定右边菜单需要滚动多高的距离,那么我们如何获得该容器滚动的距离呢? 之前一直在使用better-scroll,通过阅读文档,我们知道它有有 scroll 事件,我们可以通过监听这个事件来获取滚动的 pos

Vue实现左右菜单联动实现代码

if (this.listenScroll) {
 let me = this
 this.scroll.on('scroll', (pos) => {
 me.$emit('scroll', pos)
 })
}

所以我们在右边菜单的 scroll 组件上监听scroll事件

@scroll="scrollHeight"

method

scrollHeight (pos) {
 console.log(pos);
 this.scrollY = Math.abs(Math.round(pos.y))
},

我们将监听得到的pos打出来看看

Vue实现左右菜单联动实现代码

我们可以看到控制台打出了当前滚动的pos信息,因为在移动端开发时,坐标轴和我们数学中的坐标轴相反,所以上滑时y轴的值是负数

Vue实现左右菜单联动实现代码

所以我们要得到每一块 li 的高度,我们可以通过拿到他们的 DOM

_calculateHeight() {
 let lis = this.$refs.rightItem;
 let height = 0
 this.rightHeight.push(height)
 Array.prototype.slice.call(lis).forEach(li => {
 height += li.clientHeight
 this.rightHeight.push(height)
 })
console.log(this.rightHeight)
}

我们在 created 这个 hook 之后调用这个计算高度的函数

_calculateHeight() {
 let lis = this.$refs.rightItem;
 let height = 0
 this.rightHeight.push(height)
 Array.prototype.slice.call(lis).forEach(li => {
 height += li.clientHeight
 this.rightHeight.push(height)
 })
 console.log(this.rightHeight)
}

Vue实现左右菜单联动实现代码

当用户在滚动时,我们需要计算当前滚动距离实在那个区间内,并拿到他的 index

Vue实现左右菜单联动实现代码

Vue实现左右菜单联动实现代码

computed: {
 currentIndex () {
 const { scrollY, rightHeight } = this
 const index = rightHeight.findIndex((height, index) => {
  return scrollY >= rightHeight[index] && scrollY < rightHeight[index + 1]
 })
 return index > 0 ? index : 0
 }
}

所以当前应该是左边菜单 index = 1 的菜单项 active 以上是左边菜单根据右边菜单的滑动联动的实现,用户也可以通过点击左边菜单来实现右边菜单的联动,此时,我们给菜单项加上 click事件

@click="selectLeft(index, $event)"

这里加上 $event 是为了区分原生点击事件还是[better-scroll]((https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll 是什么)派发的事件

selectLeft (index, event) {
 if (!event._constructed) {
 return
 }
 let rightItem = this.$refs.rightItem
 let el = rightItem[index]
 this.$refs.rightMenu.scrollToElement(el, 300)
},

到这里我们就基本上完成了这些需求了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript操作excel生成报表全攻略
May 04 Javascript
JavaScript获取页面中表单(form)数量的方法
Apr 03 Javascript
JQuery实现样式设置、追加、移除与切换的方法
Jun 11 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
Jun 30 Javascript
15位和18位身份证JS校验的简单实例
Jul 18 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
jQuery ajax动态生成table功能示例
Jun 14 jQuery
react native带索引的城市列表组件的实例代码
Aug 08 Javascript
Vue.js的动态组件模板的实现
Nov 26 Javascript
JS数组方法shift()、unshift()用法实例分析
Jan 18 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 #Javascript
vue实现商品加减计算总价的实例代码
Aug 12 #Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 #Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 #Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 #Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 #Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 #Javascript
You might like
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
javascript自定义加载loading效果
2020/09/15 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
在django中自定义字段Field详解
2019/12/03 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
员工培训心得体会
2013/12/30 职场文书
教育学习自我评价
2014/02/03 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL