微信小程序中实现瀑布流

wxml


<!-- 把数据放在比较矮的那一侧,如果左右两边数据一样高,优先放置在左侧 -->
<view class="discuss-container">
  <view class="left-box">
    <template wx:for="{{leftList}}" is="item" data="{{...item}}"></template>
  </view>
  <view class="right-box">
    <template wx:for="{{rightList}}" is="item"  data="{{...item}}"></template>
  </view>
</view>
<view wx:if="{{finish}}">
  已经加载完了
</view>

<template name="item">
  <view class="item">
  <!-- mode=widthFix  宽度固定,高度自适应 -->
    <image mode="widthFix" src="{{coverImgUrl}}"></image>
    <view class="title">{{title}} <van-icon name="chat-o" bind:tap="skipChat" data-id="{{postsId}}" /></view>
  </view>
</template>

wxss


.discuss-container {
  display: flex;
}

.left-box,
.right-box {
  width: 50%;
  box-sizing: border-box;
}

.item {
  padding: 10rpx 15rpx;
  animation: fly 1s ease;
}

.item image {
  width: 100%;
}

.title {
  text-align: center;
}


@keyframes fly {
  from {
    transform: translateY(100rpx);
    opacity: 0;
  }

  to {
    transform: translateY(0);
    opacity: 1;
  }
}

image{
  width: 320px;
  /* height: 60px; */
}

js文件

// pages/chatroom/chatroom.js
import { getPostsList } from '../../utils/api'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    list: [],
    leftList: [],
    rightList: [],
    leftHeight: 0,
    rightHeight: 0,
    finish: false,  // 请求的数据是否加载完成
  },
  pageNum: 1,
  // flag  管理状态   多次触底时只执行一次,当数据都处理完后在执行第二次触底
  flag: false,

  initData() {
    if (this.data.finish) {
      return
    }
    getPostsList(this.pageNum, 15).then(res => {
      console.log(res);
      this.data.list = this.data.list.concat(res.data.rows)
      if (this.pageNum * 15 >= res.data.total) {
        // 数据已经加载完了,不需要在加载数据了
        this.setData({
          finish: true
        })
      }
      this.flag = false
      // 处理请求到的数据
      this.handleList()
    })
  },
  handleList() {
    // 如果数据处理完成,在指向下一次的触底加载
    if (this.data.list.length === 0) {
      this.flag = true
      return;
    }
    // 把list均匀的分布在左右两侧
    // 小程序端提供了一个api可以获取图片的高度
    const item = this.data.list.shift();
    // 记录高度的变化
    wx.getImageInfo({
      src: item.coverImgUrl,
      success: (res) => {
        //  判断一下这条数据应该放在左侧还是右侧
        if (this.data.leftHeight <= this.data.rightHeight) {
          // 放在左侧
          this.data.leftList.push(item)
          // 记录高度的变化
          this.data.leftHeight += res.height / res.width;
        } else {
          this.data.rightList.push(item)
          // 记录高度的变化
          this.data.rightHeight += res.height / res.width;
        }
        this.setData({
          leftList: this.data.leftList,
          rightList: this.data.rightList
        })
      },
      complete: () => {
        this.handleList()
      }
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.initData();
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

    this.pageNum++;
    this.initData();
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    console.log(11111);
    // this.pageNum = 1
    this.setData({
      leftList: [],
      rightList: [],
    })
    this.initData();
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
    // console.log(666666);
    // 请求新数据,接在旧数据后面
    if (this.flag) {
      this.pageNum++;
      this.initData();
    }
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },

  skipChat(e) {
    wx.navigateTo({
      url: '/pages/chatroomDetail/chatroomDetail?id=' + e.currentTarget.dataset.id,
    })
  }
})
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值