网上能搜到的小程序瀑布流解决方案,要么代码复杂、逻辑混乱,要么实现不了业务功能,所以把我在项目中的实现方案给大家分享下。

最简单的实现方案,不适用有分页的场景。

这个方案简单的原因是因为仅仅使用了css的属性。

使用column-count 属性可以指定页面显示的列数,一般瀑布流都是2列,所以可以定义class

.list-masonry {

column-count: 2; //2列

column-gap: 20rpx; //列间距

}

界面定义也很简单

其中,goodsList为页面展示的数据,goodsCard为瀑布流的卡片,这个很容易理解。

注意,瀑布流的卡片需要css属性 display: inline-block; 将卡片设置为 内联元素。image 组件设置缩放模式 mode="widthFix" 来保持图片宽高比。

column-count 属性默认是以列的形式来填充数据的。比如我们有20条数据,1 ~ 10 条数据会展示在左边第一列,11 ~ 20 条数据会展示在第二列。

如果有分页,再往数组中增加20条数据后,就会变成 1 ~ 20 条数据会在左边,21 ~ 40 条数据会展示在右边。用户体验非常差。

由于 column-fill: balance; 填充属性无效,无法指定填充顺序为行的形式。

所以这种实现方案只能一下加载完所有数据,不适用于分页。

Component实现瀑布流,功能强大,滑动流畅

通过自定义组件,用自己的思路实现瀑布流。然后在需要瀑布流的地方直接调用,方便复用。

没有Demo!! 跟着我的步骤一步一步来,就能轻松实现。

1. 首先创建瀑布流自定义组件文件。

建议在项目根目录创建文件夹component,然后在该目录下创建文件夹WaterFallView,最后在WaterFallView下创建component。(鼠标右键->新建->Component)。

微信截图_20180607103451.png

2. 设计瀑布流的wxml。

瀑布流的结构简单,只有左右2列。所以在设计UI的时候,布局很简单。

左右两边,一边一个View。通过这两个View 来展示瀑布流的两列。每个View对应一个数据源,由此可见,这套思路的重点是这个两个数据源的处理。每个View中的template 为瀑布流中的卡片,就不介绍了。

超过两列的瀑布流比较少见,本篇不考虑,但可用本篇的思路来实现。

3. css样式

.fall-container {

width: 100%;

display: flex;

}

.fall-left {

display: flex;

flex-direction: column;

}

.fall-right {

display: flex;

flex-direction: column;

margin-left: 20rpx;

}

4. 具体实现逻辑

根据上面的 wxml 结构,这个组件的核心逻辑就是如何把要展示的数据item 放入leftList、rightList这两个数组中。

如何分配数据item?这个简单,我们可以定义2个变量 leftHight、rightHight,来分别记录leftList、rightList数组中图片的高度(可以理解为左边View、右边View的高度,其实只是图片的高度,但已满足瀑布流的的需求)。当leftHight 大于 rightHight时,把数据放入rightList,并让rightHight叠加数据中图片的高度。当rightHight大于 leftHight 时,把数据放入leftList,并让leftHight 叠加数据中图片的高度。

if (leftHight == rightHight) { //第1个item放左边

leftList.push(tmp);

leftHight = leftHight + tmp.itemHeight;

} else if (leftHight < rightHight) {

leftList.push(tmp);

leftHight = leftHight + tmp.itemHeight;

} else {

rightList.push(tmp);

rightHight = rightHight + tmp.itemHeight;

}

瀑布流展示图片的时候,需要知道图片的宽高,然后根据图片的宽高比来设置 image组件的宽高。所以如果你们的数据没有宽高或宽高比,很难实现瀑布流。虽然可以通过代码获得图片宽高,但会对性能以及用户体验有很大影响,不推荐这么做。可以和后台同学商量下,看如何加上宽高数据。

Component有自己生命周期方法,甚至可以象Page一样,当做一个单独的页面使用。可以在他的生命周期方法中获得到瀑布流的宽度,以及图片的最大高度。

attached: function () { //第一个生命周期方法

wx.getSystemInfo({

success: (res) => {

let percentage = 750 / res.windowWidth; //750rpx/屏幕宽度

let margin = 20 / percentage; //计算瀑布流间距

itemWidth = (res.windowWidth - margin) / 2; //计算 瀑布流展示的宽度

maxHeight = itemWidth / 0.8 //计算瀑布流的最大高度,防止长图霸屏

}

});

},

拿到瀑布流的宽度后,就可以根据图片的宽高比,计算出 image 组件的宽高。

let tmp = listData[i]; //单条数据

tmp.width = parseInt(tmp.width); //图片宽度

tmp.height = parseInt(tmp.height); //图片高度

tmp.itemWidth = itemWidth //image 宽度

let per = tmp.width / tmp.itemWidth; //图片宽高比

tmp.itemHeight = tmp.height / per; //image 高度

if (tmp.itemHeight > maxHeight) {

tmp.itemHeight = maxHeight; //image 高度,不超过最大高度

}

在template中,image的宽高需要声明下。单位是px,不是rpx

class='card-img'

mode='aspectFill'

style='width:{{data.itemWidth}}px;height:{{data.itemHeight}}px;'

src='{{data.img}}'

lazy-load>

5. 所有JS代码

/**

* 瀑布流组件

*/

var leftList = new Array();//左侧集合

var rightList = new Array();//右侧集合

var leftHight = 0, rightHight = 0, itemWidth = 0, maxHeight = 0;

Component({

properties: {},

data: {

leftList: [],//左侧集合

rightList: [],//右侧集合

},

attached: function () {

wx.getSystemInfo({

success: (res) => {

let percentage = 750 / res.windowWidth;

let margin = 20 / percentage;

itemWidth = (res.windowWidth - margin) / 2;

maxHeight = itemWidth / 0.8

}

});

},

methods: {

/**

* 填充数据

*/

fillData: function (isPull, listData) {

if (isPull) { //是否下拉刷新,是的话清除之前的数据

leftList.length = 0;

rightList.length = 0;

leftHight = 0;

rightHight = 0;

}

for (let i = 0, len = listData.length; i < len; i++) {

let tmp = listData[i];

tmp.width = parseInt(tmp.width);

tmp.height = parseInt(tmp.height);

tmp.itemWidth = itemWidth

let per = tmp.width / tmp.itemWidth;

tmp.itemHeight = tmp.height / per;

if (tmp.itemHeight > maxHeight) {

tmp.itemHeight = maxHeight;

}

if (leftHight == rightHight) {

leftList.push(tmp);

leftHight = leftHight + tmp.itemHeight;

} else if (leftHight < rightHight) {

leftList.push(tmp);

leftHight = leftHight + tmp.itemHeight;

} else {

rightList.push(tmp);

rightHight = rightHight + tmp.itemHeight;

}

}

this.setData({

leftList: leftList,

rightList: rightList,

});

},

}

})

6. 使用瀑布流

a. 注册自定义组件

在使用自定义组件的Page的json文件中声明要使用的组件

{

....

"usingComponents": {

"waterFallView": "../../component/WaterFallView/WaterFallView"

}

}

b. 在 wxml 中添加组件,并加上 id

c. 在JS中找到组件,并调用fillData() 方法。下拉刷新时 isFull 传 true。

fillData: function (isFull,goods){

let view = this.selectComponent('#waterFallView');

view.fillData(isFull, goods);

},

uview 瀑布流_微信小程序瀑布流最好最简单的解决方案相关推荐

  1. Android微信小程序原理,微信小程序事件流原理解析

    这篇文章主要介绍了微信小程序事件流原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.什么是事件? 事件是视图层到逻辑层的通讯方式: 事件可 ...

  2. 小程序源码:老人疯狂裂变引流视频推广微信小程序-多玩法安装简单

    这是一款特别受老年人喜欢的一款小程序 内的视频内容都是老年人喜爱的,也是喜欢转发的 另外该小程序的插屏广告还是定时出现的哟 如此达到高收益 另外用户支持点击跳转下一条视频,或者下拉刷新 总得来说其实没 ...

  3. 微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-翟东平-专题视频课程...

    微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-2445人已学习 课程介绍         微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识. 微信小 ...

  4. 视频教程-微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统-微信开发

    微信小程序系统教程Java版[3/3阶段]_微信小程序电商系统 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试 ...

  5. 微信小程序、流应用、原生应用app、轻应用

    引言介绍: 应用分为:原生应用(Native APP).轻应用(webapp或者h5app)和混合应用(HibidAPP) 其中流应用和轻应用现在多基于浏览器开啊H5应用程序 小程序是基于微信平台(软 ...

  6. 黑马优购_微信小程序

    黑马优购_微信小程序项目 介绍 2021年5月6日-2021年5月12日在校参加微信小程序培训,由黑马讲师授课,能够利用微信提供的组件和API实现轮播图.授权用户信息.上拉加载更多等功能,由于之前对u ...

  7. 视频教程-微信小程序系统教程python版[3/3阶段]_微信小程序支付-手游开发

    微信小程序系统教程python版[3/3阶段]_微信小程序支付 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试 ...

  8. 汽车行业如何借助微信小程序引流

    我们常听到这样一句话"我不懂小程序是什么,你能简单描述下什么是小程序吗?小程序给我带来什么?小程序能带来无限流量,有多少人使用微信,就有多少潜在客户. 面对微信小程序,汽车行业怎样融合线上线 ...

  9. 微信小程序 openid及支付的若干问题解决方案

    微信小程序 openid及支付的若干问题解决方案 参考文章: (1)微信小程序 openid及支付的若干问题解决方案 (2)https://www.cnblogs.com/jhlqab/p/78500 ...

最新文章

  1. 教程 | 如何在手机上使用TensorFlow
  2. 【编译原理】关于LL(1)文法的探索
  3. 精通python设计模式-浅谈Python设计模式 - 原型模式
  4. node.js下载安装并配置WebStrom
  5. 设置log缓存_Redis中缓存击穿 缓存穿透 缓存雪崩解决方案
  6. Java基础学习总结(156)——那些年被淘汰的Java技术及框架
  7. android aidl和普通service
  8. 第三季-第25课-UDP通讯程序设计
  9. [No0000DD]C# StringEx 扩展字符串类 类封装
  10. java 分页的总页数算法
  11. python的request返回400_爬虫发出ajax请求,requests能获取正常响应,scrapy发出请求却返回400...
  12. 出租分数 20作者 陈越单位 浙江大学
  13. 阿里 M8 级大神整理出 SQL 手册:收获不止 SQL 优化,抓住 SQL 的本质
  14. DVB信道编解码与调制解调
  15. 汽车众筹系统:加速建设汽车金融新生态!
  16. 一款开源且具有交互视图界面的实时 Web 日志分析工具
  17. 分享一个ESP32中继
  18. (一)操作系统的基本概念
  19. HttpRunner 3.x快速上手
  20. word中插入图片只显示底边,其他看不到,插入公式显示不全

热门文章

  1. redis消息队列,你还不敢用?
  2. 4.【基础】iris鸢尾花物种分类--KNN
  3. 计算机教学总结经验交流稿,计算机教师工作总结发言
  4. js 通过摄像头识别二维码,可以控制闪光灯。原生 HTML 调用摄像头,有 原生HTML + JS 版本 和 VUE3 + TS 版本与 uniapp 版本
  5. c语言求素数用isprime,求素数和 isprime=1 完全没用上,请指点一下迷津?
  6. 2022什么蓝牙耳机好用?内行推荐2022热门蓝牙耳机排行榜
  7. 彩虹之家--采集器操作说明以下两种方式:
  8. NPOI导入EXCEL数据类
  9. Cstring GetBuffer 和 ReleaseBuffer
  10. net share 基本语法