问题:比如下图我点击左侧的切换菜单当中的奶茶系列,但是它样式选中的是咖啡系列。但是我只写左侧菜单栏的切换事件时它切换是没有问题,加入滚动事件就出现了问题,但是滚动事件滚动时左边的事件切换也是对应的,所以我不知道为什么样式不是选中对应的标题,请帮我找出问题并改正,谢谢。
<!-- 左侧菜单 -->
<scroll-view scroll-y class="left_menu" scroll-into-view="{{leftId}}"
>
<view
class="menu_item {{currentIndex==productType.id? 'active':''}}"
wx:for="{{catesList}}"
wx:key="*this"
wx:for-item="productType"
data-index="{{productType.id}}"
bindtap="lefyClickFn"
id="left{{productType.id}}"
>{{productType.name}}</view>
</scroll-view>
<!-- 右侧商品数据 -->
<scroll-view scroll-y class="right_content"
scroll-into-view="{{rightId}}" bindscroll="rightScroll" scroll-with-animation="true">
<view class="productType rightblockscroll"
wx:for="{{catesList}}"
wx:for-item="productType"
wx:key="*this"
id="right{{productType.id}}"
>
<view class="product_title">
{{productType.name}}
</view>
<view class="product_list"
wx:for="{{productType.productList}}"
wx:for-item="product"
wx:key="id"
>
<navigator url="/pages/product_detail/product_detail?id={{product.id}}">
<image mode="widthFix" src="{{baseUrl+'/image/product/'+product.proPic}}" ></image>
<view class="right">
<view class="product_name">{{product.name}}</view>
<!-- <view class="product_stock">库存:{{product.stock}}</view> -->
<view class="product_price">¥{{product.price}}</view>
</view>
</navigator>
<view class="buyMore" bindtap="handleCartAdd" data-id="{{productType.id}}" data-pid="{{product.id}}">
<view class="shopAdd iconfont icon-shiwu-gouwuche" >
</view>
</view>
</view>
</view>
</scroll-view>
/**
* 生命周期函数--监听页面初次渲染完成
*/
data: {
baseUrl: '',
currentIndex:1,//当前选中菜单的索引
rightId:'right1',//左侧菜单id
leftId:'left1',//右侧商品id
catesList:[],
heightArr:[],//右侧高度数组
productNum:0,//单个商品数量
totalNum:0,//商品总数量
index:0,
pindex:0,
cart:[],
},
//左侧菜单点击切换事件
lefyClickFn(e){
// console.log(e)
const {index}=e.currentTarget.dataset;
console.log("currentIndex:"+index)
this.setData({
currentIndex:index,
leftId:'left'+index,
rightId:'right'+index
})
},
//右侧滚动事件
rightScroll(e){
// console.log(e)
let st=e.detail.scrollTop;
// console.log("st:"+st)
let myArr=this.data.heightArr;
console.log("myArr:"+myArr)
for(let i=0;i<myArr.length;i++){
if(st>=myArr[i] && st<myArr[i+1]){
// console.log("myArr"+"i"+":"+myArr[i])
// console.log("myArr"+"i+1"+":"+myArr[i+1])
let j=i+1
// console.log("currentIndex:"+j)
this.setData({
currentIndex:j,
leftId:'left'+j,
})
return;
}
}
},
//获取右侧区块的高度(操作dom)
onReady: function () {
let _this=this;
let initArr=[0];//初始数组
let initNum=0;//初始数值
// image的mode属性会二次渲染 导致获取的高度和实际高度不一致 至于setTimeout的延迟是多少这个你要测试了 100毫秒 或者 setTimeout函数不设置时间或者时间为0的话 都可以试试 具体要看是否能达到想要的效果
setTimeout(()=>{//设置定时器以免取不到数据
const query = wx.createSelectorQuery().in(this);//创建节点选择器
// query.select('#rightScrollView').scrollOffset();
query.selectAll('.rightblockscroll').boundingClientRect();//选中样式为rightblock
query.selectViewport().scrollOffset();
query.exec(function(res){
// console.log(res[0]);
//拿到每一个区块高度,并存起来
res[0].map(val=>{
console.log(val.height)
initNum+=val.height;//实现高度累加
// console.log("heightArr:"+initNum)
initArr.push(initNum);//将累加出来的高度放入数组
})
console.log(initArr);
_this.setData({
heightArr:initArr,
})
})
},1000)
},
引用 皆我百晓生 小程序回复内容作答:
根据你提供的代码,我发现问题可能出在以下几个地方:
lefyClickFn
中,index
应该是productType.id
而不是e.currentTarget.dataset.index
。所以你可以尝试修改为如下代码:lefyClickFn(e){
const {index}=e.currentTarget.dataset;
console.log("currentIndex:"+index)
this.setData({
currentIndex:index,
leftId:'left'+index,
rightId:'right'+index
})
},
rightScroll
中,你在设置currentIndex
时使用的是j
,但是实际应该是i+1
,因为数组的索引从0开始,所以右侧的索引应该从1开始。所以你可以尝试修改为如下代码:rightScroll(e){
let st=e.detail.scrollTop;
let myArr=this.data.heightArr;
for(let i=0;i<myArr.length-1;i++){
if(st>=myArr[i] && st<myArr[i+1]){
let j=i+1
this.setData({
currentIndex:j,
leftId:'left'+j,
})
return;
}
}
},
onReady
生命周期函数中,你可以将setTimeout
的时间延迟调整为0,以免出现取不到数据的情况。代码如下:onReady: function () {
let _this=this;
let initArr=[0];
let initNum=0;
setTimeout(()=>{
const query = wx.createSelectorQuery().in(this);
query.selectAll('.rightblockscroll').boundingClientRect();
query.selectViewport().scrollOffset();
query.exec(function(res){
res[0].map(val=>{
console.log(val.height)
initNum+=val.height;
initArr.push(initNum);
})
console.log(initArr);
_this.setData({
heightArr:initArr,
})
})
}, 0)
},
通过以上修改,应该能够解决你遇到的问题。希望能对你有所帮助!
我找到问题了我把滑动模块拿到的高度减去标题就可以了,initNum+=val.height-19.2