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

本文详细介绍了如何使用Vue创建一个左右滑动菜单联动的组件。组件包括左菜单和右菜单,通过监听右菜单的scroll事件,计算滚动位置,从而更新左菜单的激活状态。同时,左菜单项的点击事件也能触发右菜单的滚动。代码示例展示了如何计算DOM元素高度,以及如何在组件间同步数据。
摘要由CSDN通过智能技术生成

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

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

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

class="left-menu"

:data="leftMenu"

ref="leftMenu">

  • class="left-item"

    ref="leftItem"

    :class="{'current': currentIndex === index}"

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

    v-for="(item, index) in leftMenu"

    :key="index">

    {{item}}

右菜单的 DOM 结构

class="right-menu"

:data="rightMenu"

ref="rightMenu"

@scroll="scrollHeight"

:listenScroll="true"

:probeType="3">

  • {{items.title}}
    {{item}}

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

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

props: {

leftMenu: {

required: true,

type: Array,

default () {

return []

}

},

rightMenu: {

required: true,

type: Array,

default () {

return []

}

},

}

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

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打出来看看

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

所以我们要得到每一块 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)

}

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

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)"

selectLeft (index, event) {

if (!event._constructed) {

return

}

let rightItem = this.$refs.rightItem

let el = rightItem[index]

this.$refs.rightMenu.scrollToElement(el, 300)

},

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值