小程序view-scroll组件实现左右列表联动

实现效果类似:

1.左边点击 -> 右边滚动的相应的分类 

2.右边滑动 -> 左边的样式跟着改变

思路:总共有两个view-scroll  元素,一个左边一个右边。左边点击右边滚动和右边手动滑动都是由右边的bindscroll="handleContentScroll" 来控制,其中左边点击控制需要在右边加上scroll-top="{{contentScrollTop}}",在左边点击的时候计算右边需要滚动的高度以达到让右边自动滚动的效果

 

注意:view-scroll要滑动的前提是高度要固定

具体代码:

左边:在分类上加个bindtap事件

wxml:

<view class='goods_left'>
      <scroll-view scroll-y scroll-with-animation="true" >
        <block wx:for='{{ goodsInfo }}' wx:key='index'>
          <view class='left_list {{index === activeTab ? "on" : ""}}' catchtap='changeMenu' data-index='{{ index }}'>
            <text class='list_text'>{{ item.name }}</text>
            <text class='list_num' wx:if='{{ item.typeCount > 0}}'>{{ item.typeCount }}</text>
          </view>
        </block>
      </scroll-view>
    </view>

js:其中cateHeightArr这个变量是右边每个分类对应高度的数组

 // 点击左侧
  changeMenu(e){
    const { index } = e.currentTarget.dataset
    const { cateHeightArr } = this.data
    this.data.menuClick = true
    var contentScrollTop = cateHeightArr[index - 1] || 0;
    this.setData({
      activeTab:index,
      contentScrollTop:contentScrollTop,
      scrollChange: index == 0 ? false : true
    })
  },

 

右边:

wxml: throttle="{{false}}"这个要加上,可以解决scrollTop在滑动到顶的时候,值不为0的问题

<view class='goods_right'>
      <scroll-view  
      scroll-y 
      throttle="{{false}}"
      scroll-with-animation="true"  
      scroll-top="{{contentScrollTop}}"
      bindscroll="handleContentScroll" >
        <block wx:for='{{ goodsInfo }}' wx:key='gid'>
          <view class='right_item' >
                     
                </view>
            </block>
          </view>
        </block>
        </scroll-view>
    </view>

js:

scrollTop:这个值我做了个10以内就改变scrollChange的做法

scrollChange:这个参数是因为我有个搜索置顶的效果,当置顶的时候,搜索上面的内容display:none否则为block。其中列表的高度一直是flex:1。(ps:本来想用当页面滑动置顶时,设置列表高度,这样搜索上面的内容也不用隐藏,但是这样在置顶时不能连贯的接上下面的列表滑动 。要把手拿起来重新滑动一下,会有卡顿感。所以采用了这种方式。)

menuClick:这个参数是用来判断,当用户点击左边且右边该分类内容太短无法滚动时,解决左侧activeTab会返回到该分类之上的选项,达到左侧只要点击样式就改变,右侧内容不够也不改变

// 右侧滚动监听
  handleContentScroll(e){
    const { scrollTop } = e.detail;
    const { scrollChange ,cateHeightArr ,activeTab ,menuClick} = this.data
    console.log(scrollTop)
    if(scrollTop > 10 && !scrollChange) {
        this.setData({
          scrollChange:true
        })
    }else if(scrollTop <= 10 && scrollChange){
        this.setData({
          scrollChange:false
        })
    }
    
    if(!menuClick){
      let index = cateHeightArr.findIndex(item => item > scrollTop);
      if(index != activeTab){
        this.setData({ 
          activeTab: index, 
        })
      }
    }
    this.data.menuClick = false;
  },

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值