知乎

个人博客

Github

源码传送门:Rain120/vue-study

根据掘金评论需求,更新了数据接口并修复了一些问题

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

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

动态数据结构

menus: [{name: '菜单1',data: [{name: '1.1'},{name: '1.2'},{name: '1.3'},{name: '1.4'},{name: '1.5'},{name: '1.6'}]}
]

data数据是用户自定义增加一些内容,并渲染DOM

左菜单的DOM结构

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

右菜单的DOM结构

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

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

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

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

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

if (this.listenScroll) {let me = thisthis.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打出来看看

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

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

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

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

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

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


computed: {currentIndex () {const { scrollY, rightHeight } = thisconst 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派发的事件

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

使用

<cascad-menu :menus="menus"></cascad-menu>

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

Vue实现左右菜单联动实现相关推荐

  1. vue 左右滑动菜单_Vue实现左右菜单联动实现代码

    本文介绍了Vue实现左右菜单联动实现代码吗,分享给大家,也给自己留个笔记,具体如下: 之前在外卖软件上看到这个左右联动的效果,觉得很有意思,所以就尝试使用 Vue 来实现,将这个联动抽离成为一个单独的 ...

  2. PHP随机配菜_PHP+JS三级菜单联动菜单实现方法

    本文实例讲述了PHP+JS三级菜单联动菜单实现方法.分享给大家供大家参考,具体如下: 智能递归菜单-读取数据库 TD { FONT-FAMILY: "Verdana", " ...

  3. js_jQuery【下拉菜单联动dom操作】

    下拉菜单联动dom操作案例 源码: <!DOCTYPE html> <html lang="en"><head><meta charset ...

  4. vue 递归创建菜单_如何在Vue中创建类似中等的突出显示菜单

    vue 递归创建菜单 by Taha Shashtari 由Taha Shashtari 如何在Vue中创建类似中等的突出显示菜单 (How to Create a Medium-Like Highl ...

  5. Flutter 左右菜单联动

    效果: 像这种左右菜单联动的效果很常见,即点击左边菜单列表右边刷新,这里演示一下在Flutter中的实现 页面结构 很简单,分为左右结构,左边是一个ListView,右边也是一个ListView,然后 ...

  6. axure添加下拉菜单联动

    axure使用中会遇到下拉菜单联动的设置问题,本文分步讲解. 首先,在空白页面中拖拽一个下拉框,如下所示: 之后设置该下拉框选项,如下所示: 设置下拉框名字为班号,如下所示: 之后再拖入一个下拉框,并 ...

  7. vue省市区镇四级联动

    vue省市区镇四级联动 参考文档https://terryz.gitee.io/vue/#/region/demo 使用npm把插件安装到项目中 npm i -S v-region 在项目入口main ...

  8. vue点击菜单跳转时,背景颜色动态变化

    ** vue点击菜单跳转时,背景颜色动态变化 ** html: script: export default { name: "menu", data() { return { a ...

  9. Android 多级菜单联动操作

    今天是分享一个android实现三级菜单联动效果,到了第三级菜单有点复杂,下面带着大家看下代码. 项目结构: 为了让大家更有的耐心的阅读, 我先从简单的开始说起,我们先看下demo实现的效果吧!这样可 ...

最新文章

  1. 约瑟夫死亡游戏算法问题
  2. 浙大开源 | VID-Fusion: 用于精确外力估计的鲁棒视觉惯性动力学里程计
  3. Redis进阶-Redis缓存优化
  4. 指针01 - 零基础入门学习C语言41
  5. Psych101(part1)--Day1
  6. excel填充工作日
  7. 关于@SuppressWarnings(unchecked)注解
  8. C#实现 获取指定字节长度 中英文混合字符串 的方法
  9. MPLS virtual private network OptionA实验(华为设备)
  10. FB正在大规模重构React Native,预计今年发布
  11. 使用.net的Cache框架快速实现Cache操作
  12. Rax初学者使用心得
  13. A/B Test 使用指南
  14. 我每年得忽悠10万程序员上车
  15. GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)
  16. CentOs7 安装绿色版Nginx并配置开机启动
  17. Bash解析器常用快捷键
  18. OLEDB简介,OLEDB与ODBC的关系
  19. 苹果备忘录分享不了微信提示无法连接服务器,微信分享提示universal link 校验不通过...
  20. CSS实现鼠标不可点击,样式设置以及不可点击事件的行为

热门文章

  1. 李彦宏:汽车工业面临无人驾驶百年变局
  2. 图像分类任务不用冷启动,PaddlePaddle一口气发布十大预训练模型
  3. 多巴胺:谷歌开源新型增强学习框架
  4. 科普丨浅谈人工神经网络跌宕起伏七十年
  5. Tensorflow— 递归神经网络RNN
  6. 福布斯:2022年计算机视觉领域五大发展趋势
  7. 机器人流程自动化技术的新发展
  8. 国外发明的10大仿生机械,这才是真正的黑科技!
  9. 从1G到5G,从回顾过去到展望未来
  10. 【创新应用】小图像,大图景:AI彻底改变了显微镜技术