微信小程序实现瀑布流

最近做微信小程序涉及到了瀑布流功能,由于考虑到用户微信版本,所以放弃了官方提供的瀑布流方式(有兴趣可以访问官方文档),经过最终调研,决定使用多个数组来实现。

具体思路:以两列瀑布流为主,需要展示的数据数组为数组A,左边一列展示的为数组B,右边一列展示的为数组C,循环数组A,经过页面的渲染判断当前数据加入数组B还是数组C,比如左侧数据列表高度小于右侧,则数据进入左侧数组B,同时数据渲染,循环这一步骤直到数据渲染完毕。

 具体实现:

1. 通过flex布局将页面分为两列

  .container {
    width: 100%;
    padding: 0 24rpx; // 设置下左右边距
    box-sizing: border-box;
    display: flex;
    align-items: flex-start; // 沿着交叉轴方向 起点 对齐
    justify-content: space-between; // 两端对齐
  }
  <view class="container">
    <view class="container-left" id="left">
      <repeat for="{{leftData}}">
        // ....... 瀑布流单个数据块
      </repeat>
    </view>
    <view class="container-right" id="right">
      <repeat for="{{rightData}}">
        // ....... 瀑布流单个数据块
      </repeat>
    </view>
  </view>

2. 获取element的高度

    getElementSize(selector) {
      return new Promise((resolve) => {
        let query = wx.createSelectorQuery()
        query.select(selector).boundingClientRect({
          size: true
        }).exec((res) => {
          resolve(res)
        })
      })
    }

3.循环原数组中的数据,分配到左右两列数组(data中定义 originData、leftData、rightData)

    async splitData(){
      this.setData({ // 左右两侧数组清空
        leftData: [],
        rightData: []
      })
      for (let i in this.data.originData) {
        await this.setItem(this.originData[i],i) // 这里将数据原index保存了下,不需要可忽略
      }
    }

    setItem(item, index) {
      let newItem = deepClone(item) // 这里为了把原数组index保存下,深度拷贝下赋值,不需要可忽略
      newItem.customIndex = index
      let leftData = this.data.leftData
      let rightData = this.data.rightData
      return new Promise((resolve) => {
        Promise.all([
          this.getElementSize('#left'), // 获取左右两列的高度
          this.getElementSize('#right')
        ]).then((res) => {
          let leftElement = res[0][0]
          let rightElement = res[1][0]
          // 通过判断左右两列的高度来决定新的数据置入哪侧
          if (leftElement.height > rightElement.height) {
            leftData.push(newItem)
          } else {
            rightData.push(newItem)
          }
          this.setData({
            leftData,
            rightData
          })
          resolve(true)
        })
      })
    },

 总结:该方法就像买票的两个窗口排队情况,每次来一个人都会去人少的那一列排队,适合那种单个数据块高度不怎么变化、数据不怎么更新的情况。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现微信小程序瀑布流布局的代码如下: ``` <!-- .wxml --> <scroll-view scroll-y="true" bindscrolltolower="loadMoreData"> <view class="waterfall"> <view class="waterfall-cell" wx:for="{{items}}" wx:key="{{item.id}}"> <image class="waterfall-img" src="{{item.imgUrl}}" mode="aspectFit"></image> <view class="waterfall-title">{{item.title}}</view> </view> </view> </scroll-view> /* .wxss */ .waterfall { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 10rpx; } .waterfall-cell { width: 49%; margin-bottom: 10rpx; background-color: #fff; border-radius: 10rpx; box-shadow: 0 2rpx 10rpx rgba(0,0,0,.2); } .waterfall-img { width: 100%; height: 0; padding-bottom: 100%; border-radius: 10rpx 10rpx 0 0; } .waterfall-title { padding: 10rpx; font-size: 28rpx; color: #333; } /* .js */ Page({ data: { items: [ { id: 1, title: 'Item 1', imgUrl: 'item1.jpg' }, { id: 2, title: 'Item 2', imgUrl: 'item2.jpg' }, { id: 3, title: 'Item 3', imgUrl: 'item3.jpg' }, ... ] }, loadMoreData() { // TODO: 加载更多数据 } }) ``` 以上代码中,我们使用了 `scroll-view` 组件实现了垂直滚动,并且绑定了 `bindscrolltolower` 事件,当用户滑动到底部时会触发该事件。在 `scroll-view` 内部,使用了一个 `view` 容器包裹所有的瀑布流单元格。每个瀑布流单元格使用一个 `view` 组件实现,包含了一张图片和一个标题。在 CSS 样式中,我们使用了 Flex 布局实现瀑布流布局,并设置了每个单元格的宽度、高度、margin等属性,并使用圆角和阴影使其更加美观。在 JS 代码中,我们使用了一个数组 `items` 存储了所有的数据,并且定义了一个 `loadMoreData` 函数,用于加载更多数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值