uniapp 菜单联动
实现左侧点击定位右侧商品类别/右侧滚动左侧类别定位
HTML
<template>
<view class="content">
// 左侧菜单栏
<view class="left">
<view v-for="(item,index) in list" :key="index" @click="setClickId(index)" :class="{active:index===currentIndex}">{{item.title}}</view>
</view>
// 右侧商品栏
<viewclass="right">
<scroll-view scroll-y :scroll-into-view="clickId" scroll-with-animation @scroll="scroll" @scrolltolower="lower">
<view v-for="(item1,index1) in list" :key="index1">
<view class="goodsTitle" :id="'cur'+index1">{{item1.title}}</view>
<view v-for="(item2,index2) in item1.list" :key="index2"> {{item2}} </view>
</view>
</scroll-view>
</view>
</view>
</template>
js
<script>
export default {
data() {
return {
list: [{
title: "快餐",
list: ["盖饭", "臭豆腐", "凉皮", "肉夹馍"]
},
{
title: "西餐",
list: ["牛排", "红酒", "汉堡", "鸡排"]
},
{
title: "法餐",
list: ["蜗牛", "沙拉", "鹅肝", "红酒"]
},
{
title: "中餐",
list: ["炸鸡", "烤鸭", "木桶饭", "饺子"]
},
{
title: "西餐",
list: ["牛排", "红酒", "汉堡", "鸡排"]
},
{
title: "法餐",
list: ["蜗牛", "沙拉", "鹅肝", "红酒"]
},
{
title: "中餐",
list: ["炸鸡", "烤鸭", "木桶饭", "饺子"]
},
{
title: "西餐",
list: ["牛排", "红酒", "汉堡", "鸡排"]
},
{
title: "法餐",
list: ["蜗牛", "沙拉", "鹅肝", "红酒"]
},
{
title: "中餐",
list: ["炸鸡", "烤鸭", "木桶饭", "饺子"]
},
],
clickId: "", // 点击左侧菜单右侧菜单滑动
currentIndex: 0, // 点击左侧添加样式
topList: [],
}
},
onReady() {
this.getNodesInfo();
},
methods: {
setClickId(index) {
this.clickId = "cur" + index;
this.currentIndex = index;
},
scroll(e) {
// console.log(e);
let scrollTop = e.target.scrollTop;
for(let i = 0; i < this.topList.length;i++){
let h1 = this.topList[i];
let h2 = this.topList[i+1];
if(scrollTop >= h1 && scrollTop < h2){
this.currentIndex = i;
}
}
},
// 滚动到底部
lower(){
setTimeout(()=>{
this.currentIndex = this.topList.length;
console.log(this.list.length-1)
},100)
},
// 获取节点的scrollTop数组
getNodesInfo() {
const query = uni.createSelectorQuery().in(this);
query.selectAll('.goodsTitle').boundingClientRect().exec(data => {
// console.log(data);
let res = data[0];
let rel = [];
res.map(item=>{
rel.push(item.top);
});
this.topList = rel;
console.log(this.topList);
});
}
}
}
</script>
css
<style lang="scss">
.content {
display: flex;
.left {
width: 100px;
border: 1px solid #f00;
}
.right {
flex: 1;
border: 1px solid #f00;
scroll-view {
height: 200px;
.goodsTitle {
font-size: 16px;
font-weight: 600;
background: #ffb6c1;
}
}
}
}
.active {
background: #ffb6c1;
}
</style>
左侧通过锚点定位去进行定位右侧商品类别 右侧则通过节点高度给予左侧下标赋值
注意:若为动态数据 无法获取节点信息 tolist为空 则设置延时器等待数据获取后再执行getNodesInfo()