这是一款简单又好用的瀑布流布局模板,通过页面模板+组件的方式。充分利用组件的复用性和页面的生命周期。
源码来自于作者:黄河爱浪的瀑布流布局-waterfal
本文对源码和mescroll进行了结合,总结出来方便下次可以直接使用。mescroll的使用参考这篇文章

主页面:index.vue

<template><view><mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"><helang-waterfall :newList="newList" :pageNum="pageNum"></helang-waterfall></mescroll-body></view>
</template><script>import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";import helangWaterfall from "@/uni_modules/helang-waterfall/components/helang-waterfall/helang-waterfall"export default {mixins: [MescrollMixin], // 使用mixincomponents: {"helang-waterfall": helangWaterfall},data() {return {newList: [],pageNum: 1,//页码}},methods: {upCallback(page) {this.pageNum = page.num;this.$http.post('/api/Shop/goodsList', {page: page.num,pageSize: 10,}).then(res => {if (res.code == 1) {let arr = res.data.list;this.newList = arr; // 这里只需将数据传到子组件,由子组件内方法判断是左还是右this.$nextTick(() => {this.mescroll.endSuccess(arr.length)})}}).catch((e) => {this.mescroll.endErr();});},}}
</script><style lang="scss">page {background-color: #f3f3f3;}
</style><style lang="scss" scoped>
</style>

helang-waterfall

<template><view class="waterfall-box h-flex-x h-flex-2"><view><view class="waterfall-item" v-for="(item,index) in leftList" :key="index" tag="left" :index="index"@height="onHeight" @click="goBack(item.id)"><u-image width="100%" height="332rpx" :src="$imgUrl+item.image" :lazy-load="true" border-radius="8"></u-image><view class="text"><text class="til u-line-2">{{item.store_name}}{{index}}</text><view class="money"><text>¥</text><text class="span">{{item.price}}</text></view></view></view></view><view><view class="waterfall-item" v-for="(item,index) in rightList" :key="index" @height="onHeight" tag="right":index="index" @click="goBack(item.id)"><u-image width="100%" height="332rpx" :src="$imgUrl+item.image" :lazy-load="true" border-radius="8"></u-image><view class="text"><text class="til u-line-2">{{item.store_name}}</text><view class="money"><text>¥</text><text class="span">{{item.price}}</text></view></view></view></view></view></template><script>export default {name: "helang-waterfall",watch: {newList(data, oldVal) {this.addList(data)},},data() {return {leftList: [],rightList: [],leftHeight: 0,rightHergt: 0,}},props: {newList: {type: Array,},pageNum: {type: String | Number,default: ''},title: {type: String,},},methods: {goBack(id) {console.log('页面跳转')},// 监听高度变化onHeight(height, tag) {if (tag == 'left') {this.leftHeight += height;} else {this.rightHeight += height;}},// 发出组件高度信息,在此处可以区分正确和错误的加载,给予错误的提示图片emitHeight(e) {const query = uni.createSelectorQuery().in(this);query.select('.waterfall-item').boundingClientRect(data => {let height = Math.floor(data.height);this.$emit("height", height, this.$props.tag);}).exec();},//计算将数据放在左边还是右边addList(res) {let differ = this.leftHeight - this.rightHeight;let differVal = 0;let i = differ > 0 ? 1 : 0;let [left, right] = [[],[]];let getDirection = (index) => {if (differ >= 600 && index < 3) {differVal = 1;return 'right';}if (differ <= -600 && index < 3) {differVal = -1;return 'left';}if (differ >= 350 && index < 2) {return 'right';}if (differ <= -350 && index < 2) {differVal = -1;return 'left';}if ((i + differVal) % 2 == 0) {return 'left';} else {return 'right';}}res.forEach((item, index) => {if (getDirection(index) == 'left') {left.push(item);} else {right.push(item);}i++;});this.$nextTick(() => {if (this.pageNum == 1) {this.leftList = left;this.rightList = right;} else {this.leftList = [...this.leftList, ...left];this.rightList = [...this.rightList, ...right];}})},}}
</script><style lang="scss" scoped>.waterfall-box {padding: 20rpx 10rpx;box-sizing: border-box;background: #F9F9F9;>view {padding: 0 10rpx;}}.h-flex-x {display: flex;flex-direction: row;flex-wrap: nowrap;justify-content: flex-start;align-items: flex-start;align-content: flex-start;&.h-flex-2 {>view {width: 50%;}}}.load-txt {padding: 0 0 20rpx 0;text-align: center;color: #999;font-size: 24rpx;}.waterfall-item {width: 334rpx;padding-bottom: 16rpx;background-color: #fff;border-radius: 4px;font-size: 28rpx;color: #666;margin-bottom: 20rpx;uni-image {width: 332rpx;height: 332rpx;border-radius: 8rpx 8rpx 0rpx 0rpx;}.text {width: 290rpx;margin: 8rpx auto;text-align: justify;.til {font-size: 30rpx;height: 80rpx;word-break: break-all;color: #333;}.money {font-weight: bold;margin-top: 20rpx;color: #DD1A21;font-size: 24rpx;.span {font-size: 34rpx;color: #DD1A21;}}}}
</style>

效果图


uniapp商品瀑布流相关推荐

  1. uni-app 实现瀑布流 最简洁方案

    瀑布流实现效果 实现思路 同样采用常见的两栏瀑布流布局,分别用数组goodsLeftList和goodsRightList储存左右两栏要渲染对象, 初始化时,加载一张图片,然后依次把图片加到栏高更低的 ...

  2. uniapp实现瀑布流基本写法

    大概的结构布局是这样呈现的 先由最外层一个div包裹着左右等宽的div, 左边的是index为奇数区,右边是index为偶数区,具体实现就是给每个区域添加 v-if="index%2=1&q ...

  3. uniapp实现瀑布流懒加载实现和无限上拉加载更多

    效果图: 说明: 函数说明:传入一个数组,循环获取图片高度,会根据把原数组拆分成两个数组,放在两列,                 计算单列累计高度,对比高度值的大小,实现瀑布流的布局,       ...

  4. uniapp 土法 瀑布流 - vue3

    效果图 代码 <template><view><!-- 瀑布流展示 --><!-- 标签页 --><view class="rowSta ...

  5. UNi-APP多端商品列表瀑布流页商品详情页

    <template><view class="container"><!-- 消息提醒 --><u-toast ref="uTo ...

  6. uniapp实现简单图片瀑布流

    前言: 由于使用uniapp开发的微信小程序不需要考虑响应式,因此瀑布流的实现相对于pc端更为简单. 思路: 创建宽度一致左右两个盒子用于展示图片流,用过判断两个盒子的高度大小来决定下一张图片插入到哪 ...

  7. uniapp开发:瀑布流 灵活配置 简单易用 兼容vue2vue3小程序、H5、app等多端

    概要 支持的平台 使用方式 属性说明 事件说明 组件方法 refresh的使用示例 隐藏单项图片示例 完整示例 温馨提示 关注我,不迷路 概要 custom-waterfalls-flow是一个瀑布流 ...

  8. 《uni-app》移动端纯CSS实现不等高的瀑布流效果

    <uni-app>移动端纯CSS实现不等高的瀑布流效果 前言 示例 WEB端示例 移动端示例 瀑布流实现 第一种: flex 核心代码 实现 缺点 完整代码 第二种:column-coun ...

  9. 不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计

    看到好的APP产品UI设计,真是忍不住想要停留几秒,慢慢来欣赏.今天学堂君收集了近期不错的优质的APP设计作品,看起来极舒服的UI界面,分享给大家.这一期的重点学习:在APP界面设计当中,如何应用瀑布 ...

最新文章

  1. 关于Access数据库执行Update语句后,不报错,但影响行数总是返回0的问题
  2. 牛顿求平方根法(输入是double,输出也是double)
  3. 3._FILE_和_LINE_
  4. cnn神经网络可以用于数据拟合吗_代码详解:最全面的卷积神经网络介绍,都在这里了...
  5. 深度学习实践经验汇总
  6. Flyweight Design Pattern 共享元设计模式
  7. 较高Google PR中文博客
  8. 使用Apriori算法和FP-growth算法进行关联分析
  9. linux之mktemp命令
  10. JAVA 模拟瞬间高并发
  11. css3实现浮动元素垂直水平居中
  12. 量子计算和量子加密的基础问答
  13. 品质qc工程图_QC工程图-(品管)
  14. toolchain安装教程支持_网上现成toolchain安装操作
  15. Android平台语音交友软件源码开发,语音通话的实现
  16. HTML上下左右布局
  17. 未充分说明劳务采购价格公允性、供应商合作合理性,电旗股份IPO被否.
  18. 超融合之VMware vSAN企业级超融合解决方案
  19. C++ 插件机制的实现原理、过程、及使用
  20. 【C语言循环结构题目】在屏幕上打印n行*号倒三角形(此处n为6)

热门文章

  1. 2021年广州市越秀区杰出产业人才申报条件及材料,补贴30万
  2. 用python的turtle库画一个写轮眼(血轮眼)
  3. java 图片上写字_java 在图片上写字,两个图片合并的实现方法
  4. 小程序的角标如何写?
  5. java gil,Python中的GIL机制详解
  6. scala 集合的contains 方法
  7. python搭建HTTP服务器
  8. 分配器allocator和new重载
  9. html5水滴动画,HTML5 TweenMax.js 水珠滴落动画
  10. Springboot 实现Redis消息队列