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 相关文章推荐
newxtree.js代码
Mar 13 Javascript
javascript克隆对象深度介绍
Nov 20 Javascript
JavaScript?Apple设备检测示例代码
Nov 15 Javascript
Jquery中ajax方法data参数的用法小结
Feb 12 Javascript
Angularjs实现搜索关键字高亮显示效果
Jan 17 Javascript
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
Sep 02 Javascript
浅谈Vue SSR中的Bundle的具有使用
Nov 21 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
Sep 09 Javascript
Javascript 模拟mvc实现点餐程序案例详解
Dec 24 Javascript
Javascript使用integrity属性进行安全验证
Nov 07 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
PL-880隐藏功能
2021/03/01 无线电
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
require.js中的define函数详解
2017/07/10 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Django model select的多种用法详解
2019/07/16 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
JBL英国官网:JBL UK
2018/07/04 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
综合实践活动方案
2014/02/14 职场文书
产品质量承诺书范文
2014/03/27 职场文书
团结演讲稿范文
2014/05/23 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
叶问观后感
2015/06/15 职场文书
教务处教学工作总结
2015/08/10 职场文书
给校长的建议书作文300字
2015/09/14 职场文书